如何在PHP服务中正确使用对象


How to properly use an object in a PHP service

具体场景是:一个运行beanstalkd的服务器,使用PHP库Pheanstalk。我有一个PHP工作程序作为服务运行,所以理论上它永远不会停止运行。

工作者的初始代码只是为完成工作而进行的函数调用。我想把它转移到OOP上。这将为处理的每个作业实例化一个对象。我想如果没有适当的清理,这会造成内存泄漏。

在这种情况下,在不导致内存泄漏或系统过度使用的情况下,创建/管理/销毁对象的正确方法是什么?

我已经通过PHP工作人员运行了数亿个作业,SES和Beanstalkd作为队列系统。我不担心试图让事情永远运转下去。如果您发现作业后内存使用率越来越高,请重新启动工作程序。同样,如果你刚刚和那个工人一起完成了你的第100份或第1000份工作,那就从头开始,只是为了清理一下。

管理更多的员工很容易,开始新的员工也很快。使用它。如果在开发时插入足够的调试,那么如果你确实发现了内存泄漏,就有足够的信息来确定在哪里,然后处理它。

这是我必须让PHP工作人员继续运行的shell脚本。当我从脚本中exit(98);时,它会识别出这一点并立即重新启动。我通常会为计划中的暂停和退出脚本添加其他内容。使用您可能拥有的任何init风格的系统(upstart、supervisord等)启动此脚本,脚本将继续运行,并随时重新启动,直到您做出其他决定。

#!/bin/bash
# runBeanstalkd-worker.sh
# a shell script that keeps looping until an exit code is given
# if it does an unplanned exit, restart after a second - or if it's 
#   some other declared error.
# if we've restarted in a planned fashion, we don't bother with any pause
# and for one particular code, exit the script entirely.
# The numbers 97, 98, 99 must match what is returned from the PHP script
nice php -q -f ./cli-beanstalk-worker.php -- $@
ERR=$?
if [ $ERR -eq 98 ]
then
   # a planned restart - instantly
   exec $0 $@;
fi
# unplanned exit, pause, and restart
sleep 10
exec $0 $@