Javascript 当通过$argv传递json并包含特殊字符时,json_decode返回NULL
我被迫在我的节点应用程序中使用遗留的PHP模块(外部API的包装器,它根本没有文档) 我试图通过命令行参数将一小块数据传递给我的PHP脚本,如: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
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编码)。您的方法中存在一系列问题
备选方案 您可以使用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经验。就性能而言,我不会太担心,这可能会每两个月调用一次(但必须有人实现它:))。