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
相关产品推荐
相关产品推荐

