Как получить PID из PHP функции exec () в Windows? - PullRequest
8 голосов
/ 09 сентября 2010

Я всегда использовал:

$pid = exec("/usr/local/bin/php file.php $args > /dev/null & echo \$!");

Но я использую виртуальную машину XP для разработки веб-приложения, и я не знаю, как получить pid в Windows.

Iпопробовал это на cmd:

C:\\wamp\\bin\\php\\php5.2.9-2\\php.exe "file.php args" > NUL & echo $!

И он выполняет исполняемый файл, но вывод «$!»

Как я могу получить pid в var $ pid?(используя php)

Ответы [ 3 ]

9 голосов
/ 12 июля 2011

Я использую Pstools , который позволяет вам создать процесс в фоновом режиме и захватить его pid:

// use psexec to start in background, pipe stderr to stdout to capture pid
exec("psexec -d $command 2>&1", $output);
// capture pid on the 6th line
preg_match('/ID (\d+)/', $output[5], $matches);
$pid = $matches[1];

Это немного хакерский, но он выполняет свою работу

0 голосов
/ 28 января 2019

Вот несколько менее "хакерская" версия ответа SeanDowney.

PsExec возвращает PID порожденного процесса в виде целочисленного кода выхода. Так что все, что вам нужно, это:

<?php

    function spawn($script)
    {
      @exec('psexec -accepteula -d php.exe ' . $script . ' 2>&1', $output, $pid);
      return $pid;
    } // spawn

    echo spawn('phpinfo.php');

?>

Аргумент -accepteula необходим только при первом запуске PsExec, но если вы распространяете свою программу, каждый пользователь запускает ее в первый раз, и ничто не мешает оставить ее для каждого последующее исполнение.

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

0 голосов
/ 09 сентября 2010

Вам нужно будет установить дополнительное расширение , но решение найдено по адресу Uniformserver's Wiki .

UPDATE

После некоторого поиска вы можете заглянуть в tasklist, который, по совпадению, вы можете использовать с командой PHP exec, чтобы получить то, что вы ищете.

...