加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP没有等待sem_acquire?

发布时间:2020-12-13 17:05:56 所属栏目:PHP教程 来源:网络整理
导读:不是特定的代码问题,而是更多的一般编码问题.我正在尝试在工作项目中使用信号量来限制可以同时访问某些进程的用户数. 从我的理解如下: $iKey = ftock($sSomeFileLocation,'sOneCharacterString'); //Generate the keyif($sem_id = sem_get($iKey)){ //1 use
不是特定的代码问题,而是更多的一般编码问题.我正在尝试在工作项目中使用信号量来限制可以同时访问某些进程的用户数.

从我的理解如下:

$iKey = ftock($sSomeFileLocation,'sOneCharacterString'); //Generate the key
if($sem_id = sem_get($iKey)){                            //1 user allowed
    if(sem_acquire($sem_id)){
        //Do the limited process here
        sem_release($sem_id);
    }
}

我在这里看到的问题是,如果已经有一个用户拥有信号量密钥,那么下一个用户只是等到第一个用户完成而不是仅仅是故障.任何人都知道如果达到max_acquire号码,sem_acquire(或类似的)将返回false?

谢谢

解决方法

不,根据PHP使用的实现,这是不可能的.

根据semop() man page,它应该能够在某处获取IPC_NOWAIT标志,但它看起来不像PHP实现.

实际上,看一下the PHP source code for the sysvsem package,你可以清楚地看到它会继续阻塞,即使信号中断被阻塞的过程(第320行).虽然这可能不是最佳的,但只要您了解其局限性就可以了.

就您的使用情况而言,可能还有其他实现(例如针对内存文件系统的文件锁定),这对大多数用例来说都是一样好,并且能够完全满足您的需求……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读