我目前正在尝试阻止读取文件(如果该文件已经存在并且包含内容)。我正在使用flock
方法来尝试阻止正在运行的脚本的其他实例访问它,但是它不起作用。这只是具有多个内核的服务器的问题。
while ($aEvent = current($aEvents)){
$sLockFile = '/var/tmp/'.md5($aEvent['id']).'.LCK';
$oFile = fopen($sLockFile, 'c+');
if (flock($oFile, LOCK_EX) && fgets($oFile) == '') {
fwrite($oFile, 'locked');
fclose($oFile);
} else {
fclose($oFile);
next($aEvents);
continue;
}
/*
* Do stuff here.
*/
next($aEvents);
}
因此,从这段代码中,我希望可以创建,锁定和写入文件,并且任何试图随后读取/写入文件的请求都可以在flock
调用或空检查时停止。实际上,如果似乎同时用足够的ajax请求命中代码,则将多次创建/覆盖同一文件。有什么方法可以确保PHP线程安全?
答案 0 :(得分:0)
听起来您想将LOCK_NB
位添加到flock
呼叫中。来自the flock docs:
默认情况下,此功能将阻塞,直到获得请求的锁为止;这可以通过LOCK_NB选项进行控制
您的代码将在每次调用flock
时被阻止,直到获得锁为止。听起来好像您想跳到else
块(如果存在锁)。如果是这样,您想在代码中执行此操作:
<?php
if (flock($oFile, LOCK_EX | LOCK_NB) && fgets($oFile) == '')
...