【问题标题】:PHP exec vs execution of the same command in linux terminalPHP exec vs 在linux终端中执行相同的命令
【发布时间】:2014-03-11 16:51:01
【问题描述】:

我有一个非常大的文件,5GB csv 文件,我想使用 PHP exec 方法向用户显示。

我尝试使用 linux 命令读取某些行号(第 21 到 30 行)而不是所有行:

mycprogram largefile.csv | sed -n "21,30p;30q"

终端将在输入命令后立即返回确切的行数。但是,当我在 php exec 中使用类似命令时,它将等待第一部分(mycprogram largefile.csv)完全加载到内存中(这需要很长时间),然后再进入sed 以获取我想要的行号. php代码是这样的:

$cmd = "mycprogram largefile.csv | sed -n '21,30p;30q'";
exec($cmd, $output);

是否知道我可以通过使用 PHP 方法从终端得到我从终端得到的确切信息,而无需等待 mycprogram 完全加载?

谢谢 如何

【问题讨论】:

  • 导入数据库,问题解决

标签: php linux csv sed exec


【解决方案1】:

命令mycprogram 是否在largefile.csv 上逐行转换?如果是的话,换成

$cmd = "sed -n '21,30p;30q' largefile.csv  > temp; mycprogram temp" ;

【讨论】:

  • 感谢您的建议。但它具有相同的效果,整个largefile.csv 仍将由处理器处理(可以通过top 命令查看)。尽管如此,我还是在mycprogram 中添加了标志来获取我想要的行数,而不是使用sed。从中吸取的教训是,与在终端中键入命令相比,使用 PHP exec 时并非所有进程或命令的行为都相同。
【解决方案2】:

使用 sed 上的 -u--unbuffered 选项将其视为流,默认情况下 sed 逐行加载所有文件,强制整个先前的输入被完全加载/处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2015-05-21
    相关资源
    最近更新 更多