PHP скрипт в отдельном потоке? как посмотреть id выполняемого приложения, запускаемого через пхп в windows? (и linux тоже) сейчас делаю через exec('start /B cmd /S /C "'.$command.'"'); пробовал через if ( is_resource( $prog = proc_open($runPath, $descriptorspec, $pipes, $startDir, NULL) ) ) { //Get Parent process Id $ppid = proc_get_status($prog); $pid=$ppid['pid']; но во втором случае и пид не выдает и процесс криво запускает.. т.е. запуск команды вроде как происходит, но то-ли процесс зависает то-ли еще что-то... команда начинает выполняться, но не до конца. Т.е. хотелось бы получать pid сразу после запуска команды и до ее выполнения. Чтобы потом можно было ждать и смотреть статус выполнения команды.
Вам следует использовать функцию proc_open() вместо exec() для запуска процесса в отдельном потоке. Ниже пример PHP кода, который позволяет запустить процесс в отдельном потоке и получить его идентификатор (PID) на Windows и Linux:
$descriptorspec = array( 0 => array("pipe", "r"), // stdin 1 => array("pipe", "w"), // stdout 2 => array("pipe", "w") // stderr ); $command = "your_command_here"; $process = proc_open($command, $descriptorspec, $pipes); if (is_resource($process)) { $status = proc_get_status($process); $pid = $status['pid']; echo "PID of the running process is: " . $pid . "\n"; // Для получения статуса выполнения команды можно использовать функцию proc_get_status // Например, чтобы дождаться завершения процесса: /*while (proc_get_status($process)['running']) { usleep(100000); // Подождать 0.1 секунды }*/ // Закрыть все каналы fclose($pipes[0]); // stdin fclose($pipes[1]); // stdout fclose($pipes[2]); // stderr // Закрыть процесс proc_close($process); } else { echo "Failed to open process\n"; }
При запуске команды через proc_open(), PID процесса будет доступен сразу после запуска команды your_command_here. Для получения статуса выполнения команды, вы можете использовать функцию proc_get_status() в цикле, который будет опрашивать статус процесса до его завершения.
Не забудьте добавить обработку ошибок и проверку на успешное выполнение функций для надежной работы скрипта.
Вам следует использовать функцию proc_open() вместо exec() для запуска процесса в отдельном потоке. Ниже пример PHP кода, который позволяет запустить процесс в отдельном потоке и получить его идентификатор (PID) на Windows и Linux:
$descriptorspec = array(0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "w") // stderr
);
$command = "your_command_here";
$process = proc_open($command, $descriptorspec, $pipes);
if (is_resource($process)) {
$status = proc_get_status($process);
$pid = $status['pid'];
echo "PID of the running process is: " . $pid . "\n";
// Для получения статуса выполнения команды можно использовать функцию proc_get_status
// Например, чтобы дождаться завершения процесса:
/*while (proc_get_status($process)['running']) {
usleep(100000); // Подождать 0.1 секунды
}*/
// Закрыть все каналы
fclose($pipes[0]); // stdin
fclose($pipes[1]); // stdout
fclose($pipes[2]); // stderr
// Закрыть процесс
proc_close($process);
} else {
echo "Failed to open process\n";
}
При запуске команды через proc_open(), PID процесса будет доступен сразу после запуска команды your_command_here. Для получения статуса выполнения команды, вы можете использовать функцию proc_get_status() в цикле, который будет опрашивать статус процесса до его завершения.
Не забудьте добавить обработку ошибок и проверку на успешное выполнение функций для надежной работы скрипта.