Используйте PHP proc_open + bypass_shell для запуска исполняемого файла в фоновом режиме и получения правильного PID?

Итак, в PHP в Windows: возможно ли как запустить исполняемый файл в фоновом режиме И получить его PID ? Я пришел к выводу, что можно выполнять обе задачи по отдельности, но не вместе.

Фон процесса

Чтобы фоновый процесс запускался через SHELL, команда 'start / B "bg" myprog.exe ' должен быть использован, а процесс SHELL должен быть закрыт сразу после этого.

Для этого многие люди используют pclose (popen (...)) как так pclose ( popen ('start / B "bg" myprog.exe', 'r')); но, насколько мне известно, при использовании popen невозможно получить pid .

Потому что невозможно Чтобы получить pid с помощью popen, мы должны посмотреть на proc_open.

Получение PID

Используя proc_open , мы можем получить pid исполняемого файла, если и только если bypass_shell имеет значение true.

Если bypass_shell имеет значение false (по умолчанию), Windows возвращает pid SHELL. Для получения дополнительной информации см .: https://bugs.php.net/bug.php?id=41052

Объяснение проблемы

Команда start / B завершается ошибкой при передаче в proc_open when bypass_shell = true , потому что он пропускает SHELL и отправляет аргументы командной строки непосредственно в myprog.exe, который не знает, что с ними делать.

И наоборот, если bypass_shell = false (по умолчанию) и proc_close используется для немедленного закрытия SHELL, myprog.exe работает в фоновом режиме, как и при использовании pclose (popen (...)) , НО неверно pid возвращается (мы получаем pid SHELL).

Итак, возможно ли фоновое изображение + правильное извлечение pid ?

Если нет, то что дальше лучшая вещь? Мне нужно сделать это для сценария PHP, который будет развернут на общем хостинге, поэтому сторонние расширения не могут быть установлены. Лучшее, что я могу придумать, - это сделать снимок списка задач до и после запуска myprog.exe в фоновом режиме, а затем провести перекрестный анализ результатов. Обратите внимание, что myprog.exe может работать одновременно.

Если это помогает, хотя это не должно иметь значения, myprog.exe на самом деле является ffmpeg (который устанавливается на большинстве общих веб-хостов).

Временное решение

// background the process
pclose( popen( 'start /B "bg" ffmpeg.exe', 'r') );

// get the pid using tasklist
exec( 'TASKLIST /NH /FO "CSV" /FI "imagename eq ffmpeg.exe" /FI "cputime eq 00:00:00"', $output );
$output = explode( '","', $output[0] );
$pid = $output[1];

]

6
задан leoj 23 August 2011 в 18:18
поделиться