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; } ?>
关键步骤说明
- 管道描述符配置:通过
$descriptorspec定义子进程的输入输出流,将标准输入设为父进程可写的管道,让我们能直接写入变量内容。 - 写入输入内容:使用
fwrite将$data写入标准输入管道,写完后必须关闭该管道,否则子进程会一直等待输入,导致程序卡住。 - 读取结果:通过
stream_get_contents读取命令的输出和错误信息,最后关闭所有管道并调用proc_close释放进程资源。
适配实际命令(如pdftotext)
如果实际使用的是pdftotext这类命令,只需修改$cmd为对应的参数即可(注意用-表示从标准输入读取PDF内容):
$cmd = "pdftotext -nopgbrk -layout - -";
这里第一个-表示输入来自标准输入,第二个-表示输出到标准输出,后续同样可以读取输出内容。
内容的提问来源于stack exchange,提问作者Tuckbros
相关产品推荐
相关产品推荐

