如何避免管道输入流入PHP脚本的子shell?
解决PHP脚本管道输入流入子shell命令的问题
这个问题我太熟悉了!子进程默认会继承父进程的标准输入(STDIN),管道里没被PHP处理完的输入会直接流到nano这类交互式命令里,导致它因为接收到非预期的输入而无法正常运行。给你两个实用的解决办法:
方法一:先彻底消耗STDIN
如果你需要用到管道传入的内容,先把STDIN的所有数据全部读出来,这样后续执行shell命令时,STDIN就已经是空的了,子进程不会拿到多余的输入。示例代码:
<?php // 一次性读取所有STDIN内容,彻底消耗掉管道输入 $input = file_get_contents('php://stdin'); // 这里可以处理$input的内容,比如打印或者存储 echo "Received input: \n$input"; // 现在执行nano就不会受STDIN影响了 exec('nano test.txt'); ?>
如果输入内容特别大,也可以用fopen('php://stdin', 'r')循环读取直到EOF,不过file_get_contents是最简洁的方式。
方法二:给子进程重定向STDIN到/dev/null
如果你不需要管道里的输入内容,可以直接在shell命令里把STDIN重定向到/dev/null,强制切断子进程和父进程STDIN的关联。示例代码:
<?php // 在命令末尾加上 < /dev/null,让nano从空设备获取输入 exec('nano test.txt < /dev/null'); // 用system或者passthru的话同样适用 // system('nano test.txt < /dev/null'); // passthru('nano test.txt < /dev/null'); ?>
这个方法更直接,不需要修改主脚本的输入处理逻辑,适合你只需要独立运行shell命令的场景。
两种方法都能解决问题,你可以根据自己是否需要处理管道输入来选择~
内容的提问来源于stack exchange,提问作者forthrin
相关产品推荐
相关产品推荐

