我正在尝试使用临时文件demo.lock检查进程是否已在运行:
demo.php:
<?php
$active=file_exists('demo.lock');
if ($active)
{
echo 'process already running';
}
else
{
file_put_contents ('demo.lock', 'demo');
sleep(10); //do some job
unlink ('demo.lock');
echo 'job done';
}
?>
然而它似乎不起作用:如果我打开demo.php两次它总是显示“完成工作”,也许是因为它认为它是相同的过程?有什么方法可以做到吗?我也尝试使用getmypid()得到类似的结果。
由于
答案 0 :(得分:2)
适合我。
确保脚本可以在目录中创建文件。取消注释“unlink”行并运行脚本并检查目录中是否存在锁定文件。如果您没有看到它,那么这是一个目录权限问题。
答案 1 :(得分:2)
无法确定您的具体情况出现什么问题,假设“正常,简单”的环境因为它对我有用,但至少您的代码中存在竞争条件。如果您在同一时间启动两个进程并且都发现 demo.lock 不存在会怎么样?
您可以fopen
使用x
模式来防止这种情况发生。 X模式尝试创建文件;如果它已经存在,它将失败并生成E_WARNING
错误(因此关闭运算符)。由于文件系统操作在驱动器上是原子操作,因此可以保证一次只有一个进程可以保存文件。
<?php
$file = @fopen("demo.lock", "x");
if($file === false)
{
echo "Unable to acquire lock; either this process is already running, or permissions are insufficient to create the required file\n";
exit;
}
fclose($file); // the fopen call created the file already
sleep(10); // do some job
unlink("demo.lock");
echo "Job's done!\n";
?>
我在这里测试了它似乎有效。
答案 2 :(得分:0)
好吧,发送一些标题和刷新似乎对我有用(不知道为什么),所以现在当我加载页面显示“开始”并且如果我在完成该过程之前点击浏览器上的刷新按钮,则警告消息:
<?php
$file = @fopen("demo.lock", "x");
if($file === false)
{
echo "Unable to acquire lock; either this process is already running, or permissions are insufficient to create the required file\n";
exit;
}
header("HTTP/1.0 200 OK");
ob_start();
echo "Starting";
header('Content-Length: '.ob_get_length(),true);
ob_end_flush();
flush();
fclose($file); // the fopen call created the file already
sleep(10); // do some job
unlink("demo.lock");
?>
感谢目前为止的所有答案和建议