2014-09-05 4 views
4

Я новичок в PHP, спасибо за ваше время :)PHP бесконечный цикл

я нужна функция, которая excutes на него само в PHP whitout помощь corn.for, что я comeup со следующим кодом который работает для меня хорошо, но поскольку это бесконечный цикл, это вызовет проблемы с моим сервером или скриптом, если да, дайте мне несколько предложений или альтернатив. Благодарю.

$interval=60; //minutes 
set_time_limit(0); 

while (1){ 
    $now=time(); 
    #do the routine job, trigger a php function and what not. 
    sleep($interval*60-(time()-$now)); 
} 
+0

Вы хотите php-daemon – 2014-09-05 03:13:57

+0

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

+0

как ваш новый для php, возможно, вы должны объяснить, зачем вам это нужно, возможно, есть лучшая идея. – 2014-09-05 03:17:12

ответ

4

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

Еще одна проблема, с которой мы столкнулись, - это когда вы выполняете скрипт с бесконечным циклом в своем браузере, даже если вы нажмете кнопку остановки, он будет продолжать работать, если вы не перезапустите Apache.

while (1){ //infinite loop 
    // write code to insert text to a file 
    // The file size will still continue to grow 
    //even when you click 'stop' in your browser. 
    } 

Решение состоит в том, чтобы запустить скрипт PHP в качестве деамона в командной строке. Вот как:

nohup php myscript.php &

& ставит свой процесс в фоновом режиме.

Не только мы нашли этот метод менее интенсивно использующих память, но вы также можете убить его без перезапуска Apache, выполнив следующую команду:

kill processid

Edit: Как Дагон отметил, что это на самом деле не истинный способ запуска PHP как «Daemon», но с использованием команды nohup можно рассматривать как способ бедных людей запустить процесс как демон.

+0

вызов php-скрипта из командной строки не делает его daemon – 2014-09-05 03:29:20

+0

Этот процесс является тем, что Apache и PHP не преуспевают, но какие новые технологии, такие как node.js, - IMO, такие задачи не должны быть сделанный с PHP, он неизбежно вернется и укусит вас. –

+0

@ Дагон, что БУДЕТ сделать его демоном? – zoltar

0

while(1) означает, что это бесконечная петля. Если вы хотите его разбить, вы должны использовать условие break. например ,.

while (1){ //infinite loop 
    $now=time(); 
    #do the routine job, trigger a php function and what no. 
    sleep($interval*60-(time()-$now)); 
    if(condition) break; //it will break when condition is true 
} 
+0

actully, я не хочу, чтобы он сломался, i просто хочу знать, каковы последствия. – alagu

1

Вы можете использовать функцию time_sleep_until(). Она возвращает значение TRUE или FALSE

$interval=60; //minutes 
    set_time_limit(0); 
    $sleep = $interval*60-(time()); 

    while (1){ 
    if(time() != $sleep) { 
     // the looping will pause on the specific time it was set to sleep 
     // it will loop again once it finish sleeping. 
     time_sleep_until($sleep); 
    } 
    #do the routine job, trigger a php function and what not. 
    } 
1

Есть много способов создать демон в PHP, и были в течение очень долгого времени.

Просто запустить что-то в фоновом режиме не очень хорошо. Если он пытается что-то распечатать и консоль закрыта, например, программа умирает.

Один из методов, который я использовал для linux, - pcntl_fork() в скрипте php-cli, который в основном разбивает ваш скрипт на два PID. Попросите родительский процесс убить себя и снова обработать дочерний процесс fork. Опять же, родительский процесс убивает себя. Детский процесс теперь будет полностью разведен и может радостно пообщаться в фоновом режиме, делая все, что вы хотите, чтобы он делал.

$i = 0; 
do{ 
    $pid = pcntl_fork(); 
    if($pid == -1){ 
     die("Could not fork, exiting.\n"); 
    }else if ($pid != 0){ 
     // We are the parent 
     die("Level $i forking worked, exiting.\n"); 
    }else{ 
     // We are the child. 
     ++$i; 
    } 
}while($i < 2); 

// This is the daemon child, do your thing here. 

К сожалению, эта модель не имеет возможности перезапустить себя, если он выходит из строя, или если сервер будет перезагружен. (Это можно решить с помощью творчества, но ...)

Чтобы получить надежность респауна, попробуйте сценарий Upstart (если вы на Ubuntu.) Here is a tutorial - но я еще не пробовал этот метод.

+0

Только что обнаружено [Запустить php-скрипт как процесс демона] (https://stackoverflow.com/questions/2036654/run-php-script-as-daemon-process «Вопрос о переполнении сценария»), который более полно отвечает на этот вопрос, чем У меня есть. – Amgine

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