如何检测PHP脚本是否在共享服务器上运行

时间:2014-02-07 18:14:13

标签: php process shared-hosting

我有一个在共享主机环境服务器上运行的PHP脚本。这个PHP脚本需要很长时间才能运行。完成跑步可能需要20到30分钟。这是一个反复出现的背景过程。但是我无法控制进程何时开始(可能每五分钟触发一次,或者每三个小时触发一次,没有人知道)。

无论如何,在这个脚本的开头我想检测前一个进程是否仍然在运行,如果之前的运行仍在运行但尚未完成,那么我就不会再次运行该脚本了。如果它没有运行,那么我运行新进程。

换句话说,这是一个伪代码。我们来调用脚本abc.php

1. Start script abc.php
2. Check if an older version of abc.phh is still running. If it is running, then terminate
3. If it is not running, then continue with abc.php and do your work which might take 30 minutes or more

我该怎么做?请记住这是共享主机。

更新:我在考虑使用数据库检测机制。因此,当脚本启动时,它会将DB中的值设置为“STARTED = TRUE”,完成后,它将设置为“STARTED = FALSE”。但是,此解决方案不正确,因为没有保证脚本将正确终止。它可能会被中断,因此可能不会将STARTED值更新为FALSE。因此数据库解决方案是不可能的。它必须是某种过程检测,或者可能是我没想过的不同解决方案。感谢。

2 个答案:

答案 0 :(得分:1)

如果这是CGI流程,我会尝试使用exec + ps,如果后者在您的环境中可用的话。快速SO搜索会出现这个答案:https://stackoverflow.com/a/7182595/177920

当然,您需要有一个负责(并且与其分开)检查目标脚本是否正在运行的脚本,否则您将始终看到您的目标脚本基于以下顺序运行操作你的“伪代码”。

答案 1 :(得分:0)

您可以实现一个简单的锁定机制:在脚本启动时创建一个tmp锁定文件,并在锁定文件已经存在之前检查。如果是的话,不要运行脚本,它不会创建一个锁文件并运行脚本。在成功运行结束时,删除锁定文件,以便下次正常运行。

if(!locked()) {
    lock();
    // your code here
    unlock();
} else {
    echo "script already running";
}

function lock()   { file_put_contents("write.lock", 'running'); }
function locked() { return file_exists("write.lock"); }
function unlock() { return unlink("write.lock"); }