为什么proc_get_status()没有显示进程崩溃?

时间:2018-10-18 09:43:49

标签: php

此PHP命令行脚本使用 proc_open()运行另一个脚本:

<?php
$descriptorspec = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w")
);
$crash = proc_open('php crash.php', $descriptorspec, $pipes);
$status = proc_get_status($crash);
print_r($status);

内部脚本只是故意崩溃:

<?php
crash();

我希望 proc_get_status()告诉我该进程不再运行,并且退出代码为255。

但是,这是输出:

Array
(
    [command] => php crash.php
    [pid] => 78769
    [running] => 1
    [signaled] =>
    [stopped] =>
    [exitcode] => -1
    [termsig] => 0
    [stopsig] => 0
)

为什么状态仍显示为正在运行?

(在我的实际用例中,我不能使用proc_close(),因为我特别想将多个内容传递给内部脚本,并查看导致它崩溃的原因)。

1 个答案:

答案 0 :(得分:5)

我已修改您的代码,以添加while循环来观看running返回的proc_get_status

<?php
$descriptorspec = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w")
);
$crash = proc_open('php crash.php', $descriptorspec, $pipes);
while (true) {
    $status = proc_get_status($crash);
    print_r($status);
    sleep(1);
}

运行上面的代码将并排输出两个数组,第二个也应将running显示为false,延迟1秒足以显示竞争状况的问题。

$ php modified_demo.php
Array
(
    [command] => php crash.php
    [pid] => 32575
    [running] => 1
    [signaled] =>
    [stopped] =>
    [exitcode] => -1
    [termsig] => 0
    [stopsig] => 0
)
Array
(
    [command] => php crash.php
    [pid] => 32575
    [running] =>
    [signaled] =>
    [stopped] =>
    [exitcode] => 1
    [termsig] => 0
    [stopsig] => 0
)
^C