Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP flock LOCK_EX | LOCK_NB竞争条件_Php_Apache_Cron - Fatal编程技术网

PHP flock LOCK_EX | LOCK_NB竞争条件

PHP flock LOCK_EX | LOCK_NB竞争条件,php,apache,cron,Php,Apache,Cron,在进行了大量的挖掘之后,我一直无法确定在一个小PHP伪cron上发现的竞争条件背后的问题 代码如下所示: fh = fopen(ROOT . '.cron.lock', 'w+'); if (flock($fh, LOCK_EX|LOCK_NB)) { //Cron logic goes here flock($fh, LOCK_UN); } 它应该非常简单,并且通常是有效的。关键是,每隔一段时间,这个小cron就会执行两次(向用户发送一封重复的电子邮件),这相当烦人 起初我认

在进行了大量的挖掘之后,我一直无法确定在一个小PHP伪cron上发现的竞争条件背后的问题

代码如下所示:

fh = fopen(ROOT . '.cron.lock', 'w+');
if (flock($fh, LOCK_EX|LOCK_NB)) {
    //Cron logic goes here
    flock($fh, LOCK_UN);
}
它应该非常简单,并且通常是有效的。关键是,每隔一段时间,这个小cron就会执行两次(向用户发送一封重复的电子邮件),这相当烦人

起初我认为我必须使用第三个
$ewooldblock
参数。但事实证明,这不起作用,只是导致cron总是在不考虑任何其他进程的情况下执行

每当我在CLI环境中测试这段代码时,它都可以正常工作。但是,当我开始在HTTPD(Apache)请求中使用脚本时,它就不会出现了


如果有人能提供帮助,或者给我一个指针,告诉我整个
$ewoldblock
参数是关于什么的(因为文档不是很直观),我将非常感激。

关于$eawouldblock的详细描述可以在主题中找到。您使用的是哪种操作系统,apache mpm?PHP文档声明“当使用像ISAPI这样的多线程服务器API时,您可能无法依靠flock()来保护文件免受在同一服务器实例的并行线程中运行的其他PHP脚本的影响!”。因此,如果您使用的是多线程ApacheMPM,这可能就是您的情况。CentOS预装的是HTTPD。看起来flock with LOCK_NB对我来说很好,但是当cron在其中一个进程中执行时,它显然会让几个进程保持运行。我原本打算在cron已经执行时“跳过”它,让其他进程在其中一个进程上执行cron时完成。另外,请通读您链接的帖子。这证实了我的问题与EWoldblock变量无关,代码应该工作正常。@César您最终解决了争用条件了吗?