#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();