检查php进程是否已在运行

时间:2010-04-26 16:04:39

标签: php file-exists

我正在尝试使用临时文件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()得到类似的结果。

由于

3 个答案:

答案 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");    
?>

感谢目前为止的所有答案和建议