在PHP中,我正在运行以下命令:
exec ("ls -U ".$folder." |head -1000", $ls_u);
此命令位于 PHP 文件中,由 PHP 直接在控制台上运行并引发此错误:
ls: write error: Broken pipe
导致此错误的原因是什么? 还是在 PHP exec 中使用管道不是一个好主意?
在终端上有PHP的Linux中,您可以使用以下代码重现此错误:
主.php:
<?php
$process = popen("ls", "r");
pclose($process);
?>
然后在终端上像这样运行它:
eric@dev ~ $ php main.php
ls: write error: Broken pipe
发生此错误是因为您正在运行返回数据的命令,并且您没有捕获它,因此它抱怨管道损坏。
我能够像这样修复它:
<?php
$handle = popen('ls', 'r');
$read = fread($handle, 2096);
pclose($handle);
echo $read;
?>
然后它工作,打印:
eric@dev ~ $ php main.php
main.php
anotherfile.txt
请注意,如果您想从 ls 获取所有输出,则必须将fread(...)
粘在一个循环中。
我相信
控制台命令中存在语法错误,并建议使用 escapeshellarg()
转义参数。
exec('ls -U '.escapeshellarg($folder).' | head -1000', $ls_u);