PHP exec()输出截短

PHP exec()输出截短,php,Php,我有一个PHP文件,它使用exec()运行一个节点脚本来收集输出,如下所示: $test = exec("/usr/local/bin/node /home/user/www/bin/start.js --url=https://www.example.com/"); echo $test; exec("/usr/local/bin/node /home/user/www/bin/start.js --url=https://www.example.com/", $outp

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

$test = exec("/usr/local/bin/node /home/user/www/bin/start.js --url=https://www.example.com/");
echo $test;
exec("/usr/local/bin/node /home/user/www/bin/start.js --url=https://www.example.com/", $output);
echo implode("\n", $output);
它在--url参数中输出一个绑定到网站的JSON数据字符串。它工作得很好,但有时输出字符串会被截断

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

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

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

exec()
仅返回传递给它的命令输出的最后一行。根据以下文件中标有返回值的部分:

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

要获取已执行命令的输出,请确保设置并使用输出参数

要执行您试图执行的操作,您需要向函数传递一个数组来存储输出,如下所示:

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

要使其正常工作,唯一的方法似乎是将
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\u buffering
,而不做任何更改(输出仍然被切断)


当然可以接受其他方法来避免临时文件,但也可以接受它,每次运行时只需
unlink()
文件。

它是如何自动运行的(web、cron)?当它工作时,运行需要多长时间?php中的字符串很大,对php的内部工作还不够熟悉,但这听起来可能是一个缓冲问题?使用相同的URL重新运行是否正常?或者对某些URL来说是一致的?不,使用有问题的同一URL重新运行总是很短。我注意到的唯一一件事是,在失败的URL上,字符串的长度要大得多。我是否注意到,只有当输出的一部分包含对base64数据的引用时,输出才会缩短,例如
“fonts”:{“amount”:6,“files”:["数据:application/x-font-woff2;base64,d09gmgabaaaafeaabiaaaxmwaafczaafnd…
只有一行输出作为JSON字符串,因此这不适用于我的情况。您的JSON字符串是否在任何时候都包含字符“\n”或“\r”?Exec会将这些字符作为换行符读取,因此它们有时会出现,这可能就是它出现的位置和原因toff。这也解释了为什么使用tempfile会起作用:因为您正在重定向输出,所以STDIN中没有任何换行符,因此它不会被截断。不,json.txt文件不包含任何换行符或返回符号。我只是再次运行以进行双重检查。