【问题标题】:Run Node.js script from PHP - output is truncated to 512 characters从 PHP 运行 Node.js 脚本 - 输出被截断为 512 个字符
【发布时间】:2017-03-05 22:07:29
【问题描述】:

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

脚本总是在一行中将整个响应打印为 JSON。

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

我只在php.ini 中发现了xdebug.var_display_max_data => 512 => 512,但看不出这有什么关系。

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

【问题讨论】:

  • 我将从 nodejs 应用程序的调试开始。
  • 它按预期从终端返回完整结果。如果请求的结果较短,它可以从主要的 PHP 方法正常工作。例如。如果 AuthUser 没有 photoURL 也没有长 dispalyName,则响应少于 512 个字符,并且进程 (PHP) 获得完整有效的 JSON - 一切正常。
  • PHP 7.1.2 (cli) (built: Feb 23 2017 23:40:22) ( NTS )
  • 肮脏的修复是运行$cmd = 'node script.js >' . $tmp;,而不是cat $tmp;或用php读取它,然后删除$tmp文件。希望得到真正的答案。
  • 删除 xdebug 没有任何改变。

标签: php node.js symfony firebase-authentication symfony-process


【解决方案1】:

我怀疑你的进程在 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');

【讨论】:

    猜你喜欢
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 2015-08-24
    • 1970-01-01
    • 2017-09-05
    相关资源
    最近更新 更多