保持PHP脚本作为守护程序运行的最佳方法是什么?

保持PHP脚本作为守护程序运行的最佳方法是什么?

What's the best way to keep a PHP script running as a daemon?

使PHP脚本作为守护程序运行的最佳方法是什么,以及检查是否需要重新启动的最佳方法是什么。

我有一些脚本需要运行24/7,大多数情况下,我可以使用nohup运行它们。 但是,如果它们掉线了,监视它以便使其自动重启的最佳方法是什么?


如果您不能使用(适当的)初始化结构来执行此操作(您正在共享主机上,等等),请每隔几分钟使用cron运行脚本(可以使用您喜欢的任何一种语言编写),以检查查看它们是否正在运行,并在必要时重新启动它们。


最优雅的解决方案是phpdaemon或reactPHP。


我们通过将输出传递到邮件来运行守护程序。

1
php daemon.php | mail -s"daemon stopped" foo@example.org

这样,当/如果守护程序停止,它将发送邮件,并以这种方式通知我们。

当然,这仍然意味着需要手动重启守护进程,但是我们马上就会知道。通常,如果守护程序已停止,则意味着无论如何都需要处理其他事项,因此通常可以。


快速又肮脏的cron重新启动守护程序:

1
* * * * * USER ps auxww | grep SCRIPTNAME > /dev/null || SCRIPTNAME

将USER替换为守护程序运行的用户,并将SCRIPTNAME替换为脚本的名称。将此粘贴在/etc/cron.d/restart_php_daemon中。它应该每分钟运行一次。将第一个*更改为*/2*/5以减少运行频率。

更新

如果将其放入自己的crontab中:

运行crontab -e并添加:

1
* * * * * ps auxwww | grep SCRIPTNAME > /dev/null || SCRIPTNAME

守护进程是一个在后台运行的linux进程。 apache或mysql是守护程序。
在linux环境中,我们可以使用cronjob运行后台程序,但是它有一些局限性,在某些情况下,这不是一个好主意。
例如,使用cronjob,我们无法控制以前的运行是否已经完成。
因此,将进程作为守护程序运行通常更方便。

1
2
3
4
5
6
7
8
9
10
11
// Daemonize
$pid = pcntl_fork(); // parent gets the child PID and child gets 0
if($pid){ // if pid is not 0
     // Only the parent will know the PID. Kids aren't self-aware
     // Parent says goodbye!
     print"Parent :" . getmypid() ." exiting
"
;
     exit();
}
print"Child :" . getmypid() ."
"
;

上面的代码摘自关于如何在php中创建守护程序的非常好的文章。您可以在链接上阅读


我已经成功运行了wget并将结果发送到共享服务器上的/ dev / null上。


我同意PHP并不是解决此问题的最佳工具,但是我可以理解为什么要使用PHP,以便可以重用应用程序中的组件,例如数据库访问等等。

我遇到了类似的问题,最终我开发了Fat Controller,它是用C编写的可以运行PHP脚本的守护程序。它也可以作为多线程守护程序运行,并行运行脚本的许多实例。

这里有更多信息和用例:http://www.4pmp.com/fatcontroller/


我使用基于PHP的脚本从数据库读取并发送电子邮件(使用PEAR Mail_Queue库)。我从bash脚本中运行它,并基于返回的结果(来自" exit $ status;")停止运行,睡眠X秒或立即重新启动。 (我还将检查平均负载/睡眠状态到PHP脚本中,以避免给邮件系统造成压力)。

如果是必须长期运行的长期守护程序,那么我同意,这可能不是最好的选择(尽管我听说有些套接字服务器可以长期成功运行),但是, PHP 5.3现在也确实改善了垃圾回收,并且如果脚本编写得足够好而不会意外退出,那么内存应该比以前少了很多。


TBH,PHP可能不是最好的工具,实际上不是它的设计目的。我听说过尝试这种操作时会发生内存泄漏和其他不良情况。另外请记住,每次执行脚本,PHP仅具有有限数量的资源ID(用于文件句柄,数据库连接等)。

尽管我没有编写这类应用程序的实际经验,但最好还是使用其他东西,例如python或perl,但我确实知道PHP不适合您的尝试。


推荐阅读

    linux脚本命令输信息?

    linux脚本命令输信息?,系统,信息,代码,脚本,数据,工具,发行,命令,变量,文件,l

    linux上启动脚本命令?

    linux上启动脚本命令?,服务,状态,系统,代码,脚本,工作,周期性,命令,文件,方

    linux开启运行命令?

    linux开启运行命令?,系统,服务,工作,管理,状态,命令,标准,情况,环境,工具,lin

    linux运行wps命令?

    linux运行wps命令?,软件,官网,名称,时间,电脑,系统,工具,环境,项目,数据,wps

    linux运行cmd命令?

    linux运行cmd命令?,电脑,系统,状态,情况,环境,命令,单位,管理,设备,数据,电脑

    linux重新启动命令是?

    linux重新启动命令是?,系统,工作,设备,标准,命令,灵活,用户,电源,提示,主机,l

    linux运行两个命令?

    linux运行两个命令?,网络,地址,系统,工作,暂停,命令,网站,密码,网上,入口,Lin

    linux命令运行代码?

    linux命令运行代码?,代码,单位,系统,环境,连续,保险,工具,命令,文件,音乐,Lin

    linux下编写脚本命令?

    linux下编写脚本命令?,代码,时间,工具,标准,系统,实战,平台,最新,网站,文件,l

    linux定时器脚本命令?

    linux定时器脚本命令?,系统,代码,时间,工具,工作,定期,周期性,异常,任务,脚

    linux停止脚本命令行?

    linux停止脚本命令行?,系统,工作,平台,命令,基础,第一,环境,信息,终端,程序,

    linux命令运行脚本?

    linux命令运行脚本?,代码,系统,工作,设计,状态,命令,脚本,文件,目录,终端,运

    linux上运行的命令?

    linux上运行的命令?,系统,工作,软件,网络,地址,信息,情况,命令,灵活,基础知

    linux怎么运行命令?

    linux怎么运行命令?,系统,工作,首页,工具,终端,地址,命令,信息,电脑,情况,怎

    linux右击运行命令?

    linux右击运行命令?,系统,工作,设备,标准,首页,发行,电脑,终端,命令,文件,lin

    linux如何运行命令?

    linux如何运行命令?,系统,工具,基础,代码,环境,管理,网络,初级,密码,终端,Lin

    linux脚本赋权限命令?

    linux脚本赋权限命令?,系统,档案,工作,命令,工具,脚本,权限,文件,程序,文件

    linux接收命令运行?

    linux接收命令运行?,系统,工作,工具,信息,地址,命令,连续,代码,管理,发行,lin

    linux关闭脚本命令?

    linux关闭脚本命令?,系统,服务,状态,命令,档案,暂停,软件,工具,数据,电脑,lin

    linux激活脚本命令?

    linux激活脚本命令?,系统,信息,环境,脚本,命令,代码,服务,工具,标准,官网,如