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

问题描述 投票:8回答:9

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

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

php daemon
9个回答
4
投票

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


4
投票

最优雅的解决方案是reactPHP


3
投票

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

php daemon.php | mail -s "daemon stopped" [email protected]

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

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


3
投票

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

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

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

UPDATE

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

运行crontab -e并添加:

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

1
投票

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


1
投票

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

// 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\n";
     exit();
}
print "Child : " . getmypid() . "\n";

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


0
投票

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


0
投票

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


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.