Javascript 当通过$argv传递json并包含特殊字符时,json_decode返回NULL

Javascript 当通过$argv传递json并包含特殊字符时,json_decode返回NULL,javascript,php,json,node.js,child-process,Javascript,Php,Json,Node.js,Child Process,我被迫在我的节点应用程序中使用遗留的PHP模块(外部API的包装器,它根本没有文档) 我试图通过命令行参数将一小块数据传递给我的PHP脚本,如: var spawn = require('child_process').spawn; //... //later on: var LegacyScript = spawn('php', ['bridge.php', JSON.stringify(someData)]); 在我的bridge.php中,我正在执行以下操作: <?php $dat

我被迫在我的节点应用程序中使用遗留的PHP模块(外部API的包装器,它根本没有文档)

我试图通过命令行参数将一小块数据传递给我的PHP脚本,如:

var spawn = require('child_process').spawn;
//...
//later on:
var LegacyScript = spawn('php', ['bridge.php', JSON.stringify(someData)]);
在我的
bridge.php
中,我正在执行以下操作:

<?php
$data = json_decode($argv[1], TRUE);
# this logs the data just fine - i can use the string and lint it / parse it - everything perfect
file_put_contents('phpgot.txt', $argv[1]);
# this is empty
file_put_contents('phpprocessed.txt', $data);
# this is NULL
file_put_contents('phpreencoded.txt', json_encode($data));
# my node module gets plain null
echo json_encode($data);
?>

我所采取的方法是否有效?我有点困惑,因为数据似乎很好地到达了我的PHP桥中,但是它在解析它时会失败,尽管它是通过
jsonlint
之类的非常有效的JSON

是否有另一种(更优雅的)方式将数据传递给派生的进程


编辑:我刚刚注意到,只有当JSON字符串中存在特殊字符(ü、ö、ä等)时,这才是失败的。当内容是纯拉丁字符集时,它的工作原理与预期一样。不过,我处于一个全UTF-8的环境中。

我的问题源于JSON中的特殊字符(如
ä
ö
ü

在我的输入上使用
utf_8_encode
修复了
json_decode
的输出:

$data = json_decode(utf_8_encode($argv[1]), TRUE);

如果有人对“为什么我仍然心存感激”有任何意见,因为这没有太多意义(所有内容都已用UTF-8编码)。

您的方法中存在一系列问题

  • 如果仅在Windows上传递命令行参数,则必须注意命令的外观。因为您有一个JSON编码的字符串,所以它充满了双引号、空格和其他字符,在传递时可能会进行不同的解析。该字符串可能会变成单独的参数,并最终出现在其他数组索引中。这是一本很好的读物:

  • 根据传递的数据,您的小型设置可能倾向于shell注入(命令行注入)

  • 您还必须在各种平台上测试代码;每个操作系统都有自己的怪癖

  • 从外观上看,您可能正在为每个请求生成一个新进程。这是一个性能的打击,你可能会发现在未来,这是不可接受的


  • 备选方案

    您可以使用PHP I/O流(stdin/stdout)。关于这些的文档对于PHP和NodeJS都非常好,并且它是在进程之间传递数据的推荐方法。对于PHP,文档如下所示: 对于NodeJ,子进程可能会工作:

    另一个合适的替代方案(虽然更复杂)是在随机端口上的节点中设置服务器,将端口号作为命令行参数传递给PHP,并使用PHP脚本通过
    file\u get\u contents
    连接到NodeJS服务器,并通过HTTP从那里获取数据。要放回数据,请在PHP中通过cURL函数使用POST请求


    我记得读过关于实现这一目标的更多方法;一个是FastCGI实现,另一个涉及memcached。我对这些不太了解,但你可以做你的研究并不断提问。

    这里的答案(对输入进行
    utf8\u编码)有帮助吗?是的,我一秒钟前就这么做了,它解决了我的问题。我真的不明白为什么,但还是PHP。谢谢!有了PHP对多字节字符串的支持,您可能需要花一个月的时间来研究原因。:)感谢所有的输入,我将看看PHP命令行流。我对node中的这一点很满意,但我几乎没有任何PHP经验。就性能而言,我不会太担心,这可能会每两个月调用一次(但必须有人实现它:))。