不是特定的代码问题,而是一般的代码问题。我试图在工作项目中使用信号量来限制可以同时访问某些进程的用户数量。
据我了解如下:
$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 的方法吗?
Thanks
不,根据 PHP 使用的实现,这是不可能的。
根据semop()手册页 http://linux.die.net/man/2/semop,它应该能够取IPC_NOWAIT
在某处标记,但它看起来不像 PHP 实现那样。
其实,看着sysvsem 包的 PHP 源代码 http://svn.php.net/viewvc/php/php-src/branches/PHP_5_3/ext/sysvsem/sysvsem.c?view=markup,你可以清楚地看到,即使信号中断了被阻塞的进程,它也会继续阻塞(第320行)。虽然这可能不是最佳的,但只要您了解限制就可以了。
就您的用例而言,可能还有其他实现(例如针对内存文件系统的文件锁),它们对于大多数用例来说同样好,并且能够完全满足您的需要......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)