【问题标题】:PHP exec() Output Cut ShortPHP exec() 输出截短
【发布时间】:2019-07-11 09:26:42
【问题描述】:

我有一个 PHP 文件,它使用 exec() 运行节点脚本来收集输出,如下所示:

$test = exec("/usr/local/bin/node /home/user/www/bin/start.js --url=https://www.example.com/");
echo $test;

它在 --url 参数中输出与网站相关联的 JSON 数据字符串。效果很好,但有时输出字符串会被缩短。

当我直接在 exec() 脚本中运行命令时,我得到了完整的输出,正如预期的那样。

为什么会这样?我也尝试过运行 shell_exec(),但同样的事情发生在输出被缩短时。

在 php.ini 或其他地方是否有设置来增加输出字符串的大小?

【问题讨论】:

  • 它是如何自动运行的(web、cron)?它工作时需要运行多长时间? php中的字符串很大stackoverflow.com/questions/3189040/…
  • 对 PHP 的内部工作原理不够熟悉,但听起来可能是缓冲问题。
  • 这样做有什么规律或理由吗?使用 same URL 重新运行是否正常?或者对于某些 URL 是否一致?
  • 不,使用有问题的相同 URL 重新运行总是会缩短。我注意到的唯一一件事是字符串的长度在失败的 URL 上要大得多。
  • 确实注意到只有当部分输出包含对base64数据的引用时,输出才会被缩短,例如"fonts":{"amount":6,"files":["data:application/x-font-woff2;base64,d09GMgABAAAAAFEAABIAAAAAxMwAAFCZAAFND....

标签: php


【解决方案1】:

看来让这个工作的唯一方法是将exec() 传递给一个临时文件,如下所示:

exec("/usr/local/bin/node /home/user/www/bin/start.js --url=https://www.example.com/ > /home/user/www/uploads/json.txt");
$json = file_get_contents('/home/user/www/uploads/json.txt');
echo $json;

我更喜欢直接输出并尝试在 php.ini 中增加 output_buffering 而没有任何变化(输出仍然被切断)。

绝对可以接受其他想法以避免临时文件,但也可以接受这个并且每次运行时只需 unlink() 文件。

【讨论】:

    【解决方案2】:

    exec() 只返回您传递给它的命令输出的最后一行。根据以下文档中标记为返回值的部分:

    命令结果的最后一行。如果您需要执行命令并将命令中的所有数据直接传回而不受任何干扰,请使用 passthru() 函数。

    要获取执行命令的输出,请务必设置并使用输出参数。

    要做你想做的事,你需要向函数传递一个数组来存储输出,如下所示:

    exec("/usr/local/bin/node /home/user/www/bin/start.js --url=https://www.example.com/", $output);
    echo implode("\n", $output);
    

    【讨论】:

    • 只有一行输出为 JSON 字符串,所以这不适用于我的情况
    • 您的 JSON 字符串是否在任何时候都包含字符“\n”或“\r”? Exec 会将这些读作换行符,因此它们有时会出现,这可能是它被截断的地方和原因。这也可以解释为什么如果您使用临时文件它会起作用:因为您正在重定向输出,所以 STDIN 中不会出现任何换行符,因此它不会被截断。
    • 不,json.txt 文件不包含任何换行符或返回符号。我只是再次重新运行以仔细检查。
    猜你喜欢
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多