Может скрипт php работать вечно?
Проблема в том что при нормальной работе скрипта, ростёт используемая память. В нете много подобных вопросов, но ответа не смог найти. Как это вообще можно побороть? Есть идея при работе смотреть сколько использует, при превышении определенного порога останавливать и запускать новый экземпляр, но это уход от поставленной задачи.
Вот небольшой пример:
Оба варианта работали 20 минут. Код не имеет не какого практического смысла.
while(true){
$this->_isStop();
$res=Query('SELECT * FROM table');
while($row=mysql_fetch_assoc($res)){
foreach($row AS $k=>$r){
$r==$row[$k];
}
}
unset($res,$row,$k,$r);
sleep(5);
}
}
$this->_isStop();
$res=Query('SELECT * FROM table');
while($row=mysql_fetch_assoc($res)){
foreach($row AS $k=>$r){
$r==$row[$k];
}
}
unset($res,$row,$k,$r);
sleep(5);
$this->run();
}
Получается первый вариант не увеличил кол-во используемой памяти, но с точки зрения практики - написать рабочий код так, затруднительно.
по сути вопроса - рекурсивный вызов (а это именно рекурсия во втором варианте, причем бесконечная) - так или иначе будет засирать стек, память и пр.
Стандартно такая задача решается использованием шедулера (в норме), либо вызова функции в бесконечном цикле (изврат).
каждый предыдущий экземпляр не исчезнет пока каждый из вызванных внутри экземпляров не вернет значение или void (проще говоря не закончится)
используя unset() вы лишь временно снижаете кол-во используемой памяти.
для предотвращения утечки памяти не вызывайте скрипт внутри себя а в цикле вызывайте его до тех пор пока он не вернет значение выхода из цикла:
if($this->_isStop()) return FALSE;
$res=Query('SELECT * FROM table');
while($row=mysql_fetch_assoc($res)){
foreach($row AS $k=>$r){
$r==$row[$k];
}
}
unset($res,$row,$k,$r);
sleep(5);
return TRUE;
}
while($eoc){
$eoc = $object->run();
}
//some code after
а если нужно переносить результаты работы от одной итерации цикла к другой используйте ключевое слово static при объявлении переменных которые должны существовать постоянно и хранить в себе результаты работы метода run()
но лучше использовать Cron или другой шедулер как сказал kot_
не стоит отказываться. Использование планировщика - это наиболее простое и эффективное решение подобной задачи. Единственно не стоит забывать устанавливать и проверять флаги - если необходимо обеспечивать запуск только одного скрипта
можно и так.
Но это по сути создание собственного велосипеда с квадратными колесами.
Основные проблемы при этом
1) память таки жрется все равно;
2) создаем себе проблемы на пятую точку - ибо будет работать не во всех случаях - зависит от настроек безопасности и способа запуска самого пхп.
3) очень сильно зависит от кривизны рук исполнителя и от навыков системного программирования вообще.
но впрочем тут решать ТС - ему виднее.
The cake is a lie! Не слушай их. Они тебе предлагают в скрипте вместо цикла делать форк. Как то так насколько я понял:
$pid=0;
do
{
switch ($pid ) {
case -1:
// @fail
die('Fork failed');
break;
case 0:
//Делаем сови дела
break;
default:
exit(0);
break;
}
while(($pid=pcntl_fork())==0)
}
?>