Конкретный сценарий таков: сервер, на котором выполняется beanstalkd, использует PHP-библиотеку Pheanstalk. У меня работает PHP-сервис как служба, поэтому теоретически он никогда не останавливается.
Исходный код для работника — это просто вызов функции, выполняемый для выполнения работы. Я хотел перенести это на ООП. Это создаст экземпляр объекта для каждой работы, которая была обработана. Я полагаю, что без надлежащей очистки это приведет к утечке памяти.
Каков будет правильный способ создания / управления / уничтожения объектов для использования в сценариях такого рода без утечек памяти или чрезмерного использования системы?
Я выполнил сотни миллионов заданий через работников PHP, с SES и Beanstalkd в качестве систем очереди. Я не беспокоился о том, чтобы продолжать работать вечно. Если вы обнаружите, что после выполнения задания интенсивно используется память, перезапустите работника. Точно так же, если вы только что выполнили свою сотую или 1000-ю работу с этим работником, перезапустите его с нуля, просто чтобы привести в порядок.
Легко запустить больше рабочих, и быстро начать новую. Используй это. Если при разработке подключите достаточно отладки, чтобы, если вы обнаружили утечку памяти, там было достаточно информации, чтобы выяснить, где, а затем устранить ее.
Это сценарий оболочки, который я должен поддерживать для работника PHP. Когда я exit(98);
Исходя из сценария, он распознает это и немедленно перезагружается. Я обычно добавляю другие для запланированных пауз и выхода из сценария. Начните это с любой системы стиля инициализации, которую вы можете иметь (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 $@
Других решений пока нет …