0

我们使用 Symfony 进程从 PHP 运行 node.js CLI 脚本。

该脚本始终在一行中将整个响应打印为 JSON。

响应以某种方式被截断为 512 个字符。

我只发现了这一点xdebug.var_display_max_data => 512 => 512php.ini但看不到这是如何相关的。

Adapter > Symfony Process > node script.js

A) 测试节点脚本

  1. 从终端节点脚本$ node user-update.js parameters返回所有情况下的完整结果 - 比如 629 个字符。
  2. 来自 Symfony Process 节点脚本的响应被截断为 512 个字符。

B) 测试 Symfony 进程

$process = new Process($cmd);
try {
    $process->mustRun();
    $response = $process->getOutput();
} catch (ProcessFailedException $e) {
    $response = $e->getMessage();
}
echo $response;
echo PHP_EOL;
echo strlen($response);
  1. $cmd = 'node user-update.js parameters';- 截断为 512。
  2. $cmd = 'php -r \'for($i=0; $i<520; $i++){ echo "."; }\'';- 不截断。
  3. $cmd = 'cat long_one_line.txt';- 打印完整文件。一行 1650 个字符。

C) 尝试使用 PHP shell 函数

$response = shell_exec($cmd); // response is truncated to 512
system($cmd, $returnVal); // print directly to STDOut, truncated to 512

可能是什么原因和解决方案?

  • 节点 v7.6.0
  • PHP 7.1.2
4

1 回答 1

0

我怀疑您的进程在 PHP 可以读取缓冲区之前结束。

作为一种解决方法,您可以添加如下内容:

// The `| cat` at the end of this line means we wait for
// cat's process to end instead of node's process.
$process = new Process('node user-update.js parameters | cat');
于 2017-03-06T14:00:41.187 回答