Почему так плохо постоянно запускать PHP-скрипт? - PullRequest
7 голосов
/ 21 марта 2011

У меня есть карта.На этой карте я хочу показать живые данные, собранные из нескольких таблиц, некоторые из которых имеют поразительное количество строк.Излишне говорить, что получение этой информации занимает долго время.Также задействован пинг.В зависимости от того, находятся ли серверы в автономном режиме или далеко, сбор этих данных может варьироваться от 1 до 10 минут.

Я хочу, чтобы карта была быстрой и отзывчивой, поэтому я решил добавить новую таблицу в свойбаза данных, содержащая только те данные, которые нужны карте.Это означает, что мне нужен фоновый процесс для постоянного обновления информации в моей новой таблице.Задания Cron, конечно, возможны, но я хочу, чтобы обновление данных происходило, как только закончился предыдущий интервал.А что, если количество автономных IP-адресов внезапно увеличится, и цикл будет выполняться дольше, чем интервал задания Cron?

Мое собственное решение - создать бесконечный цикл в PHP, который запускается из командной строки.Этот цикл обновляет данные для карты в MySQL, а также записывает другие полезные данные, такие как время цикла и неудачные попытки проверки связи и т. Д., А затем перезапускается после короткой паузы (несколько секунд).

Однако - IМне постоянно говорят, что PHP-скрипт, работающий вечно, ПЛОХО.Через некоторое время он заберет гигабайты оперативной памяти (и другие ужасные вещи)

Частично я пишу этот вопрос, чтобы подтвердить, так ли это на самом деле, но некоторые советы и подсказки о том, как я буду писатьчистый цикл, который не пропускает память (если это возможно) не будет ошибочным.Мнения по этому вопросу также были бы оценены.

Ответ, который я чувствую, проливает свет на вопрос, который я отмечу как правильный.

Ответы [ 5 ]

4 голосов
/ 21 марта 2011

Цикл должен быть в одном скрипте, который будет активировать / вызывать реальный скрипт как другой процесс ... очень похоже на то, что делает cron.
Таким образом, даже если происходит утечка памяти, и не накапливаемая память накапливается, онабудет / должен быть свободным после каждого цикла.

2 голосов
/ 21 марта 2011

Однако - мне неоднократно говорили люди, что PHP-скрипт, работающий вечно, ПЛОХО.Через некоторое время он заберет гигабайты оперативной памяти (и другие ужасные вещи)

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

Пока ваш код предпринимает шаги, позволяющие переменным выходить из области видимости в нужное время, и в противном случае сбрасывать переменные, которые больше не будут использоваться, ваш скрипт не долженпотреблять ненужные объемы памяти только потому, что это PHP.

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

Вместо того, чтобы запускать бесконечный цикл, я хотел бы использовать опцию cron, которую вы упомянули в сочетании с записью в таблице базы данных или простым файлом, который вы будете использовать для хранения «текущего активного» бита состояния, чтобы гарантировать, чтоу вас не было перекрывающихся процессов, пытающихся запускаться одновременно.

Хотя я понимаю, что это будет означать небольшую задержку перед выполнением следующей итерации, в любом случае, это, пожалуй, лучшая идея:

  1. Это позволит СУБД выполнять любые ожидающие обновления с низким приоритетом и т. Д., Которые могут быть отложены из-за объема выполняемой вами работы.

  2. Даже если вы аккуратно сбросите все временные переменные, которые вы использовали, все еще возможно, что PHP «утечет» памяти, хотя недавние улучшения (5.2 представили новую систему управления памятью исборка мусора была пересмотрена в 5.3), если , мы надеемся, , это означает, что эта проблема не так важна.

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

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

Я не думаю, что это плохо, так как со всем, что вы хотите работать непрерывно, вы должны быть более осторожными.

Существуют библиотеки, которые помогут вам с этой задачей.Взгляните на System_Daemon , который выпустил RC 1 чуть более месяца назад, что позволяет вам «устанавливать такие параметры, как максимальное использование ОЗУ».

0 голосов
/ 21 марта 2011

Сначала я не вижу, как вам нужен скрипт демона, чтобы обеспечить описанную вами функциональность.

Задания Cron, конечно, возможны, но я хочу, чтобы обновление данных происходило, как только закончился предыдущий интервал

Ни задание cron, ни демон не являются способом решения проблемы (если только демон не становится приемником данных для сценариев). Я бы породил диссоциированный процесс, когда данные доступны с использованием стратегии блокировки, чтобы избежать параллелизма.

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

...