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

时间:2015-03-22 18:10:45

标签: php oop beanstalkd pheanstalk

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

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

在不导致内存泄漏或系统使用过多的情况下,创建/管理/销毁对象以在此类场景中使用的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我通过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 $@