Скрипт PHP pcntl — требуется руководство

#php #process #pcntl

#php #процесс #pcntl

Вопрос:

Я работаю над проектом очистки, где-то в приложении мне нужна эта функциональность

запускайте скрипт снова и снова с паузой в несколько секунд.

Я попытался использовать pcntl для выполнения задания. итак, написал этот скрипт

 /************************/
$intra_sleep=10; // we're going to set the intra process launch sleep at 10 seconds
$task_process=null; // by default this is set to null -- do nothing
$loop_limit=0; // this is the number of times the loop shoul run -- if set to -1 look infinite number of times

if (isset($argv[1])) $task_process=$argv[1];
if (isset($argv[2])) $intra_sleep=$argv[2];
if (isset($argv[3])) $loop_limit=$argv[3];


for ($loop_count=0; $loop_limit==-1 ? true : $loop_count< $loop_limit; $loop_count  ) 
{
  $pid= pcntl_fork();

   if ($pid == -1) 
   {
    die('MASTER: could not fork');
   } 
   else if ($pid==0) 
   {
     if ($task_process) 
     { 
       echo "Sleeping for  $intra_sleep Secondsn"; 
       sleep($intra_sleep);
       echo "Launching Child nn"; 
       exec($task_process); // from here process script is being launched
     } 
     else 
     {
    echo "  CLONE: no task process defined -- doing nothing " . PHP_EOL;
     }
  } 
  else 
  {
     pcntl_waitpid($pid,$status);  
  } 


}

/*********************/
  

Я вызываю этот скрипт из CLI следующим образом

 nohup php /this/script.php "php /path/to/process.php" 10 -1
  

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

Мое требование очень простое: скрипт должен запускаться снова и снова с 10-секундной паузой.

Ответ №1:

Если вы просто хотите повторять PHP-скрипт каждые x секунд, то вы можете использовать контроллер Fat для обработки всех демонизации и запуска скриптов для вас, чтобы вы могли сосредоточиться на бизнес-логике в вашем PHP-скрипте. Он написан на C, поэтому он очень стабилен, независимо от того, что вы делаете в своих PHP-скриптах.

В основном он предоставляет следующие функциональные возможности:

  • демонтаж, поэтому вам не нужно возиться с nohup)
  • многозадачность, в вашем случае не имеет значения, поэтому вы просто устанавливаете для параллельных процессов значение 1
  • повторный запуск, поэтому вам не нужно возиться с разветвлением.

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

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

http://fat-controller.sourceforge.net/