进程间通信

进程间通信允许程序员在不同进程之间进行通信。例如,让我们考虑一下我们需要编写一个可以运行 bash 命令并打印输出的 PHP 应用程序。我们将使用 proc_open,它将执行命令并返回我们可以与之通信的资源。以下代码显示了从 php 运行 bash 中的 pwd 的基本实现

<?php
    $descriptor = array(
        0 => array("pipe", "r"), // pipe for stdin of child
        1 => array("pipe", "w"), // pipe for stdout of child
    );
    $process = proc_open("bash", $descriptor, $pipes);
    if (is_resource($process)) {
        fwrite($pipes[0], "pwd" . "\n");
        fclose($pipes[0]);
        echo stream_get_contents($pipes[1]);
        fclose($pipes[1]);
        $return_value = proc_close($process);

    }
?>

proc_open 使用 $descriptor 作为描述符规范运行 bash 命令。之后我们使用 is_resource 来验证过程。完成后,我们可以使用根据描述符规范生成的 $ pipes 开始与子进程交互。

之后我们可以简单地使用 fwrite 来写入子进程的 stdin。在这种情况下,pwd 接着回车。最后 stream_get_contents 用于读取子进程的 stdout。

始终记得使用 proc_close() 来关闭子进程,proc_close() 将终止子进程并返回退出状态代码。