【发布时间】:2019-01-11 04:25:32
【问题描述】:
我写了一个简单的函数,用来判断一个脚本是否已经在运行,并防止重复进程:
class SomeClass{
public static function processLock($name)
{
$lockFile = "/tmp/" . $name;
$fp = fopen($lockFile, "w+");
if ($fp === false)
{
echo "Already running.\n";
exit;
}
else
{
if ( ! flock($fp, LOCK_EX | LOCK_NB))
{
echo "Already running.\n";
exit;
}
}
return $fp;
}
}
然后我可以在 php 脚本的顶部调用这样的函数:
脚本_A:
<?
include_once "/SomeClass.php";
$lock = SomeClass::processLock("script_A_lock");
这很好用...... 99% 的时间。但是,有时我会发现“script_A”没有运行(它应该一直在运行)。
然后我运行lsof /tmp/script_A_lock 来查看为什么“script_A”没有启动。
结果毫无意义!我得到这样的东西:
COMMAND PID ......... NAME
Script_B 234 ......... script_A_lock
一个不相关的脚本“script_B”不知何故窃取了文件锁!
所以:
- 这是怎么回事? “script_A_lock”这个词只出现在 Script_A 中(我搜索了整个项目)并且 Script_A 不包括在任何地方。
- 如何防止这种情况发生?显然,只有脚本 A 应该持有“script_A_lock”。
【问题讨论】:
标签: php command-line-interface daemon