如何使用php exec避免“ls:写错误:断管”

时间:2012-07-02 15:35:57

标签: php

在PHP中我正在运行此命令:

exec ("ls -U ".$folder." |head -1000", $ls_u);

此命令位于PHP文件中,由PHP直接在控制台上运行并抛出此错误:

ls: write error: Broken pipe

导致此错误的原因是什么?或者在PHP exec中使用管道不是一个好主意?

2 个答案:

答案 0 :(得分:3)

在终端上使用PHP的Linux中,您可以使用以下代码重现此错误:

main.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(...)放在一个循环中。

答案 1 :(得分:-1)

我相信控制台命令中存在语法错误,并建议使用escapeshellarg()转义参数。

exec('ls -U '.escapeshellarg($folder).' | head -1000', $ls_u);