2010-08-28 4 views
1

У меня есть процесс, который нужно запускать с определенными вещами, и он не подходит для запуска в конце пользователя (15 секунд для обработки), поэтому я решил использовать задание cron, но опять же, это также непригодно, потому что оно создаст задний журнал. Я сузил свои возможности до бесконечного процесса, который отслеживает изменения mysql, или настраивает mysql для запуска скрипта, когда он обнаруживает изменение, но последнее не то, что я хочу вставить, если только это не единственный вариант, который оставляет меня с опцией «бесконечного» мониторинга.Лучший подход для запуска «бесконечного» мониторинга процессов MySQL?

Рода вещи я рассматриваю с РНР:

while (true) { 
    $db->query('SELECT * FROM database'); 
    while($row = $db->fetch_assoc()){ 
    // do the stuff here 
    } 
    sleep(5); 
} 

, а затем запустить его с помощью командной строки. Теперь это теоретически звук , но на практике это не так, как я надеялся, используя больше ресурсов, чем я ожидал бы (но не из моего диапазона, просто не для того, к чему я стремился оптимально). Поэтому мои вопросы таковы:

  1. Является ли PHP неправильным языком для этого? PHP - это то, с чем я работаю, но я понимаю, что бывают времена, когда это неправильный выбор, и я думаю, возможно, это так. Если да, то какой язык я должен использовать?

  2. Есть ли лучший подход, который я не рассматривал и который не является ни одной из идей, которые я перечислил?

  3. Если PHP является правильным вариантом, как я могу оптимизировать код, который я опубликовал, есть ли способ лучше, чем спать в течение 5 секунд после каждой завершенной операции?

Заранее благодарен! Я открыт для любых идей, пока они не слишком далеко, я запускаю свой собственный сервер со свободным правлением, поэтому нет теоретического лимита на то, что я могу сделать.

ответ

6

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

while true; do 
    php /path/to/your/script.php 2>&1 | logger ...(logger options) 
    sleep 5 
done 

Я нашел этот подход гораздо более надежной для длительных сценариев в PHP, вероятно, потому, что это очень нравится, как PHP работает при запуске, как сценарий CGI.

+0

Я знаю его старую нить, но это отличный ответ. Но скажите мне, если я продолжу процесс инициализации процесса, не будет ли перераспределение ресурсов проблемой? Представьте себе сценарий, когда соединение ресурсов уничтожается только на конце клиента и установлено на тайм-аут на сервере, может ли это быть избыточным? Мне любопытно, потому что я использую MongoDB с бесконечными процессами в PHP Python и C. И Python и C настолько просты в этом, и ваш подход может помочь мне улучшить PHP! К сожалению, MongoDB не закрывает соединение с конца клиента. –

0

какие проблемы вы испытываете? Я не знаю о классе базы данных, который у вас там в $ db, но он может генерировать утечку памяти.

Кроме того, я предлагаю закрыть все ваши соединения и отключить все ваши переменные, если необходимо, в конце цикла и снова открыть в начале! , если его единственная 5-секундная спящая мава только на каждые 10-й интернат или что-то в этом роде. вы можете сделать счетчик для этого ...

Эти точки считали, что нет ничего плохого в этом подходе.

+0

set_time_limit не требуется при запуске PHP CLI. [Ссылка] (http://nl2.php.net/manual/en/features.commandline.differences.php) – Lekensteyn

+0

thats correct ... –

1

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

Что-то вроде Python может работать лучше для ваших нужд; это немного более естественно предназначено для «демона-подобных» программ.

Это возможно сделать то, что вы хотите в PHP.

+0

в основном правда, но на этом уровне theres действительно никакой разницы я думаю! –

4
  1. Вы всегда должны работать с языком, который вам больше всего известен. Если это PHP, то это неправильный выбор.

  2. Отключиться от базы данных перед сном. Таким образом, ваш скрипт не сохранит соединение, и он будет работать нормально даже после перезапуска базы данных.

  3. Бесплатный mysql результат после его использования. Всегда проверяйте условия ошибок в демонтированных процессах и обрабатывайте их соответствующим образом.

Смежные вопросы