我有一个PHP脚本,用于监听传入的套接字请求等。我需要这个脚本在服务器上持续运行(它在无限循环中运行)。
如何启动和管理此流程?我试着通过ssh/putty启动它,但是一旦ssh连接超时,脚本就会消失。
作为守护进程运行php脚本的可能副本
很多好信息:stackoverflow.com/search?Q= PHP+守护进程
检查"screen"实用程序,将会话与ssh分离(如果需要,稍后再重新连接)。
如果您有一个长期运行的PHP脚本作为解决方案,那么您要么有一个学术问题、一组奇怪的情况,要么正在寻找更好的解决方案。回到主题,在抽象的层次上,您需要一些东西来管理您的PHP进程,以便在死亡、OOM、月亮移动对齐等情况下重新启动它(这个管理器不应该是另一个PHP脚本):-)
myscript.php &
这将在后台运行脚本
你可以查一下
ps aux | grep myscript.php
正如Patrick在下面的注释中提到的,从命令行运行PHP脚本没有最长的执行时间。myscript.php将无限期运行。
你可以用set_time_limit覆盖它。
从命令行运行时没有时间限制
@帕特里克很高兴知道!
这并不是真正稳定的,因为脚本可能会因错误或内存泄漏而死亡,并且不会再次启动。
这对我来说是可行的,但是在重新启动服务器之后,我需要手动设置,在自动重新启动服务器脚本之后,还有什么方法可以设置吗?
我们最近也有类似的需求。我们正在运行一个Ubuntu14.04LTS服务器,因此创建了一个upstart进程,以在引导时启动该进程,并在该进程因任何原因退出时重新启动。
它对我们来说非常好,包括自动重启;我们长期运行的过程最终会断开MySQL连接。在upstart进程自动重新启动进程之前,脚本处理异常并退出。我们还添加了一个cron脚本来监视进程,以防出现更大的错误,而upstart放弃尝试重新启动;如果简单的重新启动无法纠正先前的错误,我们将提供故障保护。
这也是我的第一选择。
您好@kdrewske您能提供任何代码示例或其他可以帮助寻找相同问题的人的东西吗?我是其中之一。)
@Pankajjha-我刚刚搜索了"Ubuntu新贵的例子",从Digitial Ocean得到了一个很好的向导。digitalOcean.com/community/tutorials/…。它讨论的远不止我的示例所能提供的。它执行的PHP脚本只是可以通过cli调用的东西,只需在while循环中包含一个代码。
@Kdrewske非常感谢你的帮助,谢谢,这正是我需要的。我还查阅了一些类似的教程,我发现最好的一个是这个链接,我希望它能帮助一些人,就像它帮助了我一样。
如果使用ignore_user_abort()并设置_time_limit(),则可以使用浏览器。
通过ssh在后台运行脚本,如下所述:让ssh在目标计算机的后台执行命令
然后我建议您有一种方法来监视脚本是否仍在运行。您提到过您的脚本在端口上监听,您可以编写一个脚本,每隔一段时间检查一次,看看端口是否仍然打开。
另一个选项是监视进程ID。当脚本第一次执行时,可以使用getmypid函数获取进程ID并将其存储在文件中。然后,您可以使用ps -p 1234定期检查它是否仍在运行。
另一个解决方案:如何检查PHP脚本是否仍在运行
如果长期运行的可靠性是目标,那么,监工是完美的!
我通过https://lornajane.net/posts/2012/watch-over-long-running-processes-with-supervisor找到了它。
编辑:此工具的目的是解决所述问题。规定的目标是使长期运行的过程保持运行。一条评论指出(有效地)当前接受的解决方案将不可靠,因为脚本可能崩溃等。因此,解决方案是使用一个工具"启动和管理这个过程",这也保持了它的活力。这个工具就是这样做的:它在后台启动进程并使其保持运行。
您可以运行它的命令行。您必须添加一个"在后台运行"修饰符,这样系统就不会等待脚本完成。基本上,您在命令行的末尾放了一个&;符号。
您必须做的一件事是创建一个在启动时运行PHP脚本的ini shell脚本,以防重新启动。
为什么不做一个do while循环呢?do { /* your code */ } while $something == 0;
然后,当有什么事情触发脚本停止时,将$something设置为0以外的值。
我认为$something = 0;是一个任务,不是一个对/错的测试。但是我相信你知道……另一件事是,如果你把任何东西建立在循环场景上,除非你的逻辑(脚本/函数…无论如何)阻塞某些东西——任何"空闲"的循环都不会是空闲的,但会使服务器CPU紧张,浪费宝贵的资源在服务器范围或至少虚拟服务器范围内。