PHP没有等待sem_acquire?

时间:2011-01-31 23:17:41

标签: php semaphore

不是特定的代码问题,而是更多的一般编码问题。我正在尝试在工作项目中使用信号量来限制可以同时访问某些进程的用户数。

根据我的理解以下内容:

$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?

由于

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

从PHP 5.6.1开始,它支持sem_acquire的$ nowait参数:

bool sem_acquire ( resource $sem_identifier [, bool $nowait = false ] )

顺便说一下,PHP中ftok()的第二个参数必须是一个字符串,而不是由多个字符组成的字符串,如你的情况。例如

$project = "c";
$key = ftok(__FILE__, $project);