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

PHP通过shell_exec调用外部程序时的输入写入方法问询

PHP与外部程序双向交互(写入实现)

shell_exec只能单向获取程序输出,没法实现双向读写。要和等待输入的外部程序交互,得用proc_open函数——它能创建双向管道,同时处理输入和输出。

实现步骤

  • 定义进程的IO描述符,明确标准输入、输出、错误流的处理方式(用管道实现双向通信)。
  • 调用proc_open启动外部程序,拿到管道句柄。
  • 通过fwrite向标准输入管道写入内容,写完用fflush确保数据立即发送给外部程序。
  • 配合你已掌握的读取逻辑处理程序输出。
  • 最后关闭所有管道句柄,用proc_close终止进程。

代码示例

// 定义IO描述符:stdin设为管道,stdout和stderr也用管道
$descriptorspec = [
    0 => ["pipe", "r"], // 标准输入,PHP写、外部程序读
    1 => ["pipe", "w"], // 标准输出,外部程序写、PHP读
    2 => ["pipe", "w"]  // 标准错误输出
];

// 启动外部程序(替换成你的可执行程序路径)
$process = proc_open('your_executable_program', $descriptorspec, $pipes);

if (is_resource($process)) {
    // 向外部程序写入内容
    $inputData = "需要发送的输入内容\n另一条输入\n";
    fwrite($pipes[0], $inputData);
    fflush($pipes[0]); // 强制刷新缓冲区,确保数据即时发送

    // 如果程序需要持续输入,不要关闭$pipes[0],可多次调用fwrite
    // 若程序需EOF触发处理,再关闭输入管道:fclose($pipes[0]);

    // 读取外部程序输出(你已掌握读取逻辑,此处做示例)
    stream_set_blocking($pipes[1], 0); // 设置非阻塞,避免读取卡住
    while (!feof($pipes[1])) {
        echo fgets($pipes[1]);
        usleep(100000); // 短暂休眠,减少CPU占用
    }

    // 关闭所有管道
    fclose($pipes[0]);
    fclose($pipes[1]);
    fclose($pipes[2]);

    // 终止进程并获取退出状态
    $exitCode = proc_close($process);
    echo "\n程序退出状态码: $exitCode";
} else {
    echo "无法启动外部程序";
}

注意事项

  • 若程序需要持续交互(不依赖EOF结束),不要提前关闭输入管道,可按需多次调用fwrite发送数据。
  • 处理间歇性输出时,设置非阻塞读取能避免PHP进程被卡住。
  • 务必关闭所有管道和进程,防止系统资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:40:52