Использование памяти PHP во время сна и циклов - PullRequest
2 голосов
/ 21 марта 2011

У меня есть несколько вопросов об использовании памяти PHP. Я собираюсь провести несколько тестов самостоятельно, но полезны различные советы.

Недавно я узнал о функции PHP ignore_user_abort (), которая позволяет скрипту продолжать работу, даже если пользователь закрывает страницу. Я думал об использовании этого для своего инструмента электронной рассылки вместо заданий Cron, так как настройка заданий Cron сопряжена с различными трудностями. У альтернативного подхода, заключающегося в том, чтобы пользователь оставался на странице, используя запросы AJAX и запускала часть скрипта после доставки содержимого страницы, также есть проблемы.

Мое решение состояло бы в том, чтобы запустить call ignore_user_abort (true) в начале сценария, а в конце после того, как содержимое было сгенерировано, для правильной меры вызовите flush (), а затем запустите сценарий новостной рассылки. В качестве альтернативы, сделайте это с AJAX.

Прежде всего, кто-нибудь видит проблемы с этим подходом?

Во-вторых, если бы я использовал сценарий без установленного ограничения по времени и циклом while, проходящим через каждое электронное письмо, каким было бы использование памяти, если бы я делал это за один раз? Поскольку я буду перезаписывать переменные, а не использовать новые, я думаю, что они будут низкими.

В-третьих, потому что, если я отправляю большое количество писем, скажем, 1000 за цикл, я не хочу перегружать свой почтовый сервер. С моей работой cron я запускаю скрипт каждые 5 минут, отправляя партию из 50 писем. Если бы я делал это за один проход, могу ли я отправить 50 электронных писем, позвонить в спящий режим, скажем, на 5 минут, а затем продолжить еще 50 писем? Если да, то каково использование памяти сценариев в период ожидания? Это будет эффективный метод?

То, что я действительно пытаюсь сделать здесь, - это найти способ создать инструмент для новостной рассылки, который не требует сложной (для нетехнических людей) задачи создания задания Cron (которое даже не требуется). опция на общих хостах), и не требует, чтобы пользователь держал свой браузер открытым на одной странице.

Любые идеи, предложения или отзывы приветствуются. Спасибо!

1 Ответ

1 голос
/ 21 марта 2011

На предыдущей работе мы написали демон для критической функции в PHP, не совсем то, что вы описываете, но достаточно похожее - конечно, с циклами и спящими. Мы очень сомневались в его долгосрочной стабильности - особенно в управлении памятью - поэтому подвергли ее довольно жесткому стресс-тестированию. Результаты были превосходны, и код был запущен в производство и работал безупречно в течение месяцев, если не лет.

Предостережения:

  • IIRC, PHP имеет мусор на основе счетчика коллектор. Это означает, что, в отличие от Java, два объекта, ссылающиеся на каждый другой останется в памяти, даже если нет доступны для вашей программы. Тебе нужно быть осторожным с этим, когда ты «оставь» свои объекты.
  • Веб-серверы часто есть механизмы, чтобы убить долгосрочные сценарии. Это может победить Ваша цель здесь - особенно если конфигурация сервера не может быть настроенная.
...