【问题标题】:How to detect if PHP script is running on a shared server如何检测 PHP 脚本是否在共享服务器上运行
【发布时间】:2014-02-07 18:14:12
【问题描述】:

我有一个在共享托管环境服务器上运行的 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。所以数据库解决方案是不可能的。它必须是某种过程检测,或者可能是我没有想到的不同解决方案。谢谢。

【问题讨论】:

  • 你在运行 Linux 吗?
  • 您可以创建一个锁定文件,例如scriptname.lock 到您的脚本在脚本开头运行的目录并在最后删除它。在此之后,您可以检查文件是否在开头是否存在,如果它确实会死掉脚本
  • 我是否正确理解这是一个 CLI 进程?
  • @engvrdr 这比不可接受的数据库标志方法好多少?
  • @sirago 开发是 Windows XAMPP。生产服务器是 Linux。

标签: php process shared-hosting


【解决方案1】:

如果这是一个 CGI 进程,我会尝试使用 exec + ps,如果后者在您的环境中可用。快速搜索一下就会找到这个答案:https://stackoverflow.com/a/7182595/177920

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

【讨论】:

    【解决方案2】:

    您可以实现一个简单的锁定机制:在脚本启动时创建一个 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"); }
    

    【讨论】:

    • 不保证脚本会正确终止。因此我可能无法解锁文件。
    • 你可以在// your code here附近使用try catch,如果它抛出任何异常,可以在catch部分解锁。所以下一次运行就会成功。
    • 我不确定这是否可行。因为 try 不会终止,而是会运行另一个我想阻止的脚本实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2019-05-14
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多