Лучший подход для запуска «бесконечного» процесса мониторинга MySQL? - PullRequest
1 голос
/ 29 августа 2010

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

Что-то, что я рассматриваю в PHP:

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 секунд после каждой завершенной операции?

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

Ответы [ 4 ]

6 голосов
/ 29 августа 2010

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

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

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

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

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

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

1 голос
/ 29 августа 2010

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

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

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

0 голосов
/ 29 августа 2010

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

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

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

...