【问题标题】:PHP no wait sem_acquire?PHP没有等待sem_acquire?
【发布时间】:2017-04-22 06:15:47
【问题描述】:

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

据我了解如下:

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


    【解决方案1】:

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

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

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

    就您的用例而言,可能还有其他实现(例如针对内存文件系统的文件锁定)同样适用于大多数用例,并且能够完全满足您的需求...

    【讨论】:

    • 感谢 ircmaxell,在网上研究这个让我得到了同样的结果,但也希望其他人也能接受。再次感谢。
    • @Ser:当然。有了这样的东西,当它怀疑时,浏览源代码(当然只要你能理解C,并且知道在哪里看)......记住,虽然文档可能撒谎或没有说出全部真相,但源代码永远不会谎言……
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多