Я запускаю сценарий CLI, который в основном спит. Каждые 10 секунд скрипт что-то выполняет. Проблема в том, что скрипт сидит при использовании 94% процессора во время сна.
Способ, которым я его устанавливал:
while(1){ sleep(10); doStuff(); }
Хотя это работает по назначению, есть очевидная проблема. В C ++ / Java я мог бы просто установить таймер, который устранит проблему с циклом. Кроме того, я надеялся, что мне не нужны работы cron.
Есть ли альтернативный способ сделать это?
По-видимому, мой оригинальный скрипт (который был довольно большой) никогда не входил в спящий режим, поэтому цикл while выполнял единичные и сжигаемые циклы CPU. Для тех, кто имеет такую же проблему, убедитесь, что это не так!
Раньше, когда мне нужно было сделать скрипт PHP демоном, я использовал модуль PEAR, описанный здесь: http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/
Если вы не хотите использовать модуль PEAR, вы можете изучить его исходный код и сделать что-то подобное.
Мой скрипт был настроен примерно так:
define('THREAD_SLEEP', 10); // Sleep time $sleep = false; // Skips the first sleep while(1){ if($sleep){ sleep(THREAD_SLEEP); } $sleep = true; // By default, the script enters sleep mode each loop. if(doSomethingAndHaveMoreToDo()){ $sleep = false; // If more stuff to do, remove sleep and keep doing it. } }
вdefine('THREAD_SLEEP', 10); // Sleep time $sleep = false; // Skips the first sleep while(1){ if($sleep){ sleep(THREAD_SLEEP); } $sleep = true; // By default, the script enters sleep mode each loop. if(doSomethingAndHaveMoreToDo()){ $sleep = false; // If more stuff to do, remove sleep and keep doing it. } }
Проблема заключалась в том, что сценарий сохранял значение $sleep
false
, что означало, что он никогда не входил в спящий режим и не использовал почти 100% процессор.