You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何使用proc_open将变量内容通过管道传递给外部进程

用proc_open直接传递变量内容给外部命令(无需临时文件)

核心思路是利用proc_open的管道描述符配置,将子进程的标准输入绑定到可写管道,直接把变量内容写入该管道,替代临时文件作为输入源。

完整代码示例

<?php
// 目标外部命令(以grep为例,实际可替换为pdftotext等支持标准输入的命令)
$cmd = "grep -i hello";
// 需要传递给命令的输入内容
$data = "Hello World\nThis is a test line\nAnother line containing HELLO\nNo match here";

// 配置管道描述符:
// 0: 子进程的标准输入,父进程以可写模式打开(用于写入$data)
// 1: 子进程的标准输出,父进程以可读模式打开(用于读取命令结果)
// 2: 子进程的标准错误,父进程以可读模式打开(用于读取错误信息)
$descriptorspec = [
    0 => ["pipe", "w"],
    1 => ["pipe", "r"],
    2 => ["pipe", "r"]
];

// 启动外部进程
$process = proc_open($cmd, $descriptorspec, $pipes);

if (is_resource($process)) {
    // 将变量内容写入子进程的标准输入
    fwrite($pipes[0], $data);
    // 关闭输入管道:告诉子进程没有更多输入,避免进程挂起等待
    fclose($pipes[0]);

    // 读取命令的输出和错误信息
    $output = stream_get_contents($pipes[1]);
    $error = stream_get_contents($pipes[2]);

    // 关闭输出和错误管道
    fclose($pipes[1]);
    fclose($pipes[2]);

    // 获取命令的退出状态码,并关闭进程
    $exitCode = proc_close($process);

    // 输出结果
    echo "命令输出:\n";
    echo $output;
    if (!empty($error)) {
        echo "\n错误信息:\n";
        echo $error;
    }
    echo "\n退出状态码: " . $exitCode;
}
?>

关键步骤说明

  1. 管道描述符配置:通过$descriptorspec定义子进程的输入输出流,将标准输入设为父进程可写的管道,让我们能直接写入变量内容。
  2. 写入输入内容:使用fwrite将$data写入标准输入管道,写完后必须关闭该管道,否则子进程会一直等待输入,导致程序卡住。
  3. 读取结果:通过stream_get_contents读取命令的输出和错误信息,最后关闭所有管道并调用proc_close释放进程资源。

适配实际命令(如pdftotext)

如果实际使用的是pdftotext这类命令,只需修改$cmd为对应的参数即可(注意用-表示从标准输入读取PDF内容):

$cmd = "pdftotext -nopgbrk -layout - -";

这里第一个-表示输入来自标准输入,第二个-表示输出到标准输出,后续同样可以读取输出内容。

内容的提问来源于stack exchange,提问作者Tuckbros

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:50:55