【问题标题】:How to check if a php script is still running如何检查 php 脚本是否仍在运行
【发布时间】:2010-09-12 03:31:00
【问题描述】:

我有一个监听队列的PHP 脚本。从理论上讲,它永远不会死。有什么东西可以检查它是否还在运行? Ruby's God ( http://god.rubyforge.org/ ) 之类的 PHP

上帝是语言不可知论者,但如果有一个也适用于 Windows 的解决方案,那就太好了。

【问题讨论】:

    标签: php process queue monitoring


    【解决方案1】:

    这是我为解决类似问题所做的工作。如果其他人有一个参数化的 php 脚本,您希望 cron 经常执行,但只希望在任何时候运行一个执行,这会有所帮助。将此添加到您的 php 脚本的顶部,或创建一个通用方法。

    $runningScripts = shell_exec('ps -ef |grep '.strtolower($parameter).' |grep '.dirname(__FILE__).' |grep '.basename(__FILE__).' |grep -v grep |wc -l');
    if($runningScripts > 1){
        die();
    }
    

    【讨论】:

      【解决方案2】:

      我在 windows 上使用过 cmder,基于这个脚本我想出了这个我后来设法在 linux 上部署的脚本。

      #!/bin/bash
       clear
       date
       while true
       do
          php -f processEmails.php
          echo "wait a little while for 5 secobds..."; 
          sleep 5
       done 
      

      【讨论】:

        【解决方案3】:

        如果您在直接检查 PHP 脚本时遇到问题,您可以制作一个简单的包装器并检查它。我对 Windows 脚本编写不够熟悉,无法在这里说明它是如何完成的,但在 Bash 中,它看起来像......

        wrapper_for_test_php.sh

        #!/bin/bash
        php test.php
        

        然后您只需像检查任何其他 bash 脚本一样检查包装器:pidof -x wrapper_for_test_php.sh

        【讨论】:

          【解决方案4】:

          受 Justin Levene 的回答启发并改进了它,因为 ps -C 在 Mac 中不起作用,我需要它。所以你可以在 php 脚本中使用它(也许就在你需要守护进程之前),在 Mac OS X 10.11.4 和 Ubuntu 14.04 中测试:

          $daemonPath = "FULL_PATH_TO_DAEMON";
          $runningPhpProcessesOfDaemon = (int) shell_exec("ps aux | grep -c '[p]hp ".$daemonPath."'");
          if ($runningPhpProcessesOfDaemon === 0) {
              shell_exec('php ' . $daemonPath . ' > /dev/null 2>&1 &');
          }
          

          小而有用的细节:为什么用grep -c '[p]hp ...' 而不是grep -c 'php ...'

          因为在计算进程时grep -c 'php ...' 将被计算为符合我们模式的进程。因此,对 php 的第一个字母使用正则表达式会使我们的命令与我们搜索的模式不同。

          【讨论】:

            【解决方案5】:

            你可以在你的 crontab 中这样写:

            0 3 * * * /usr/bin/php -f /home/test/test.php my_special_cron
            

            您的 test.php 文件应如下所示:

            <?php
            
            php_sapi_name() == 'cli' || exit;
            
            if($argv[1]) {
               substr_count(shell_exec('ps -ax'), $argv[1]) < 3 || exit;
            }
            
            // your code here
            

            这样,您将只有一个活动的 cron 作业实例,my-special-cron 作为进程键。因此,您可以在同一个 php 文件中添加更多作业。

            test.php system_send_emails sendEmails

            test.php system_create_orders orderExport

            【讨论】:

              【解决方案6】:

              在linux中运行ps如下:

              ps -C php -f
              

              然后你可以在 php 脚本中做:

              $output = shell_exec('ps -C php -f');
              if (strpos($output, "php my_script.php")===false) { 
                shell_exec('php my_script.php  > /dev/null 2>&1 &');
              }
              

              上面的代码列出了所有完整运行的php进程,然后检查“my_script.php”是否在正在运行的进程列表中,如果没有则运行该进程并且不等待进程终止继续进行做它正在做的事情。

              【讨论】:

              • 你能解释一下选项吗?
              【解决方案7】:

              我遇到了同样的问题 - 想检查脚本是否正在运行。所以我想出了这个,并将它作为一个 cron 作业运行。它将正在运行的进程作为一个数组抓取并循环遍历每一行并检查文件名。似乎工作正常。将 #user# 替换为您的脚本用户。

              exec("ps -U #user# -u #user# u", $output, $result);
              foreach ($output AS $line) if(strpos($line, "test.php")) echo "found";
              

              【讨论】:

                【解决方案8】:

                只需在脚本后附加第二个命令。当/如果它停止,则调用第二个命令。例如:

                php daemon.php 2>&1 | mail -s "Daemon stopped" you@example.org
                

                编辑:

                从技术上讲,这会立即调用邮件程序,但仅在 php 脚本结束时才完成命令。这样做会捕获 php-script 的输出并包含在邮件正文中,这对于调试导致脚本停止的原因很有用。

                【讨论】:

                • 不,在运行php的过程中,会运行mail命令。但是,一旦它停止,它会发送一个 EOF,这会导致邮件程序发送邮件
                【解决方案9】:

                troelskn 写道:

                只需在脚本后附加第二个命令。当/如果它停止,则调用第二个命令。例如:

                php daemon.php | mail -s "Daemon stopped" you@example.org
                

                每次在 daemon.php 中打印一行时,这将调用 mail(应该永远不会,但仍然如此。)

                相反,使用双和号运算符来分隔命令,即

                php daemon.php & mail -s "Daemon stopped" you@example.org
                

                【讨论】:

                • 你这里只用了一个&,你的评论不真实。邮件不会在每一行发送,它只会在 EOF 上发送
                【解决方案10】:

                如果你掌握了脚本,你可以让他在 db 中每 X 次设置一个时间值,然后让 cron 作业检查该值是否是最新的。

                【讨论】:

                  【解决方案11】:

                  不适用于 Windows,但...

                  我有几个长期运行的 PHP 脚本,它们有一个包装它的 shell 脚本。您可以选择从脚本中返回一个值,该值将在 shell 脚本中检查以退出、立即重新启动或休眠几秒钟 - 然后重新启动。

                  这是一个简单的脚本,它一直运行 PHP 脚本,直到它被手动停止。

                  #!/bin/bash
                  清除
                  日期
                  php -f cli-SCRIPT.php
                  echo "请稍等...";睡觉 10
                  执行 $0

                  “exec $0”重新启动脚本,而不会创建稍后必须解开的子进程(同时占用资源)。这个 bash 脚本封装了一个邮件发送者,所以如果它退出并暂停片刻也不是问题。

                  【讨论】:

                  • 这和我现在用的God脚本差不多,而且肯定比忙着等要好。
                  【解决方案12】:

                  一种可能的解决方案是让它使用套接字函数侦听端口。您可以使用简单的脚本检查套接字是否仍在侦听。甚至像 pingdom 这样的监控服务也可以监控它的状态。如果它死了,则套接字不再监听。

                  很多解决方案..祝你好运。

                  【讨论】:

                    【解决方案13】:

                    简单的 bash 脚本

                    #!/bin/bash
                    while [true]; do
                        if ! pidof -x script.php;
                        then
                            php script.php &
                        fi
                    done
                    

                    【讨论】:

                    • 另外,注意你的 CPU 使用率飙升 :)
                    • 不是很广泛...我经常使用它(好吧,每分钟都在 cron 工作中)
                    • 这有这么多问题,我不敢相信。 [true] 是无效的语法,您可以通过等待 php 脚本结束来摆脱 if。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2023-03-25
                    • 2013-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多