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

19

Как я могу вызвать внешний скрипт (или, альтернативно, внешний PHP-скрипт) из самого PHP и получить его идентификатор процесса в том же скрипте?

    
задан Christian Studer 24.09.2009 в 12:47
источник

3 ответа

34
$command =  'yourcommand' . ' > /dev/null 2>&1 & echo $!; ';

$pid = exec($command, $output);

var_dump($pid);
    
ответ дан Boris Guéry 24.09.2009 в 14:17
источник
  • В чем смысл «> / dev / null 2> & 1 & echo $ !;" –  andho 25.09.2009 в 10:48
  • означает «отправить весь вывод на нулевое устройство, что означает, что весь вывод будет доступен в стандартном режиме, а echo $! просто эхо pid, которое захватывается скриптом –  Boris Guéry 25.09.2009 в 17:33
  • Это также означает, что команда будет выполняться в фоновом режиме (это будет то, что вы хотите, если вы хотите pid), и поэтому ваш php-скрипт не будет ждать завершения команды –  Tofandel 15.06.2017 в 22:50
11

Если вы хотите сделать это строго с помощью инструментов, которые PHP дает вам, а не Unix-specific wizardry , вы можете сделать поэтому proc_open и proc_get_status , хотя необходимость передать спецификатор дескриптора в proc_open делает его неприятно многословным:

<?php

$descriptorspec = [
    0 => ['pipe', 'r'],
    1 => ['pipe', 'w'],
    2 => ['pipe', 'w']
];
$proc = proc_open('yourcommand', $descriptorspec, $pipes);
$proc_details = proc_get_status($proc);
$pid = $proc_details['pid'];

echo $pid;
    
ответ дан Mark Amery 30.09.2014 в 01:28
источник
  • Это должен быть принятый ответ. –  Michael Käfer 26.10.2017 в 16:25
2

Для кросс-платформенного решения ознакомьтесь с symfony / process .

use Symfony\Component\Process\Process;
$process = new Process('sleep 100');
$process->start();
var_dump($process->getPid());

После установки symfony/process с композитором ( composer require symfony/process ) вам может потребоваться обновить информацию для автозагрузки composer dump-autoload , а затем потребовать автозагрузку с require __DIR__ . '/vendor/autoload.php'; .

Обратите внимание, что вы можете получить PID только процесса running . См. документацию для сведений о API.

    
ответ дан Mike 05.03.2018 в 16:26
источник