0

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

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

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

4

1 回答 1

0

我使用 SES 和 Beanstalkd 作为队列系统,通过 PHP 工作者运行了数亿个作业。我不担心试图让事情永远运行。如果您发现在作业之后,内存使用率越来越高,请重新启动工作程序。同样,如果您刚刚完成了与该工人的第 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 $@
于 2015-03-22T20:49:59.690 回答