Выполнить действие, когда процесс завершен в PHP

#php #process

#php #процесс

Вопрос:

Я использовал эту функцию, чтобы проверить, запущен процесс или нет. (Я получил это отhttp://nsaunders.wordpress.com/2007/01/12/running-a-background-process-in-php /):

 function Is_Process_Running($PID){

exec("ps $PID", $ProcessState); 
return(count($ProcessState) >= 2);  
}
  

Насколько я понимаю, функция вернет результат только в том случае, если в массиве $processState содержится более двух строк, что и произойдет, если процесс активен.

Таким образом, легко закодировать что-либо для выполнения действия во время выполнения процесса, как показано ниже (также по ссылке выше):

 while(is_process_running($PID))
   {
     echo(" . ");
       ob_flush(); flush();
            sleep(1);
   }
  

Но тогда каков наилучший способ выполнить действие, когда процесс завершен? Я пытался:

 while(! is_process_running($PID))
  

но это не работает, я думаю, потому что цикл выполняется только один раз. Любая помощь очень ценится, спасибо!

Ответ №1:

Просто поместите код, который будет выполнен после цикла:

 // Process is still running
while (is_process_running($PID))
{
  // wait
}

// Process is no longer running
do_stuff_afterwards();
  

Если вам нужно выполнить ветвление в зависимости от того, выполняется ли процесс вообще в первую очередь, вы можете обернуть все это в if (is_process_running($PID)) условие.

Комментарии:

1. черт возьми, я действительно не думал, что это будет так просто, большое спасибо! Однако я не осознавал, что это заставляет страницу php приостанавливаться, поскольку она ожидает цикла while, что для меня не идеально. Нужно подумать о другом решении, возможно, передать PID в скрипт bash или что-то в этом роде. Приветствия!

2. @Jingo: PHP всегда только однопоточный. Если вам нужно дождаться события, вам, вероятно, придется обратиться к какой-либо системе обратного вызова на основе событий. Я не знаком ни с одним из PHP с головы до ног, но я ни в коем случае не эксперт, и есть вероятность, что такое решение существует. Вы всегда можете задать отдельный вопрос об «асинхронном ожидании завершения процесса в PHP» или около того…

Ответ №2:

Ознакомьтесь с функциями PCNTL (http://php.net/manual/en/ref.pcntl.php ). В зависимости от того, что вы пытаетесь сделать, эта библиотека может быть очень полезной. На отдельных страницах функций есть несколько примеров кода … проверьте pcntl_wait();