从 PHP 调用 node.js 脚本不返回任何内容

Posted

技术标签:

【中文标题】从 PHP 调用 node.js 脚本不返回任何内容【英文标题】:Calling node.js script from PHP returns nothing 【发布时间】:2014-03-24 09:56:52 【问题描述】:

理论上我想做的事情很简单,但我无法让它发挥作用。

我编写了一个简单的 node.js 脚本,它使用 request 包异步获取一些数据,对其进行解析,并将其作为 html 输出。我想将此脚本集成到我客户的基于 php 和 apache 的网站中,该网站位于共享主机上,但遇到了一些障碍:

    没有 mod_proxy,所以我不能简单地通过 Apache 将我的节点脚本作为服务器和代理运行 我不想在端口 80 上运行节点并从节点代理到 apache。这对我需要做的事情来说太过分了,而且会给我带来太多的麻烦。众所周知,我的特定共享主机在保持节点服务器实例正常运行时遇到了问题,而且我不能仅仅为了运行这个脚本就证明潜在的停机时间是合理的。 我尝试了node-cgi 包,但它对我不起作用。我收到有关内部节点方法不存在的错误,我认为这个包已经过时了。

所以我所要做的就是尝试从 PHP 中简单地调用 node。我的整个index.php 文件是:

<?php
  header("Content-Type: text/html");
  exec("node beerlist.nd", $output);
  echo implode('', $output);

当我在命令行上执行php index.php 时,我得到了预期的输出,但是,当我尝试从浏览器访问它时,我什么也得不到,即Content-Length: 0。为什么?

我认为这可能与我的节点脚本的异步性质有关,但似乎该进程在完成所有异步调用之前一直保持活动状态。那么我的 php sn-p 不应该毫无问题地将输出发送到浏览器吗?我在这里错过了什么?

编辑:我的节点脚本的要点是

var req = require('request')

req("http://mywebsite.com", function(err, resp, body) 
  var output = // pull some interesting pieces out of the whole body
  console.log(output);
);

output 变量的生成并不是这里问题的核心。相关部分是我使用request 进行异步调用并使用console.log 输出我的结果......也许这是一个问题?

【问题讨论】:

执行node beerlist.nd 是否产生非空结果? 如果你的意思是在命令行上做node beerlist.nd,是的,它是非空的。 好吧,您正在混合两种不同的技术,如果您的节点程序进行解析,然后通过 http 获得结果,这不是更容易吗?这似乎是真正的黑客解决方案,应该避免。 console.log 在最小格式化***.com/questions/4976466/…... 之后写入标准输出...此外,我的字符串函数只是去除了空白和一些不需要的行。接受的答案对我有用。 @parker.sikand:是的,我知道console.log 也会进入标准输出,但之后做了一些你不一定能控制的事情。由于做这些事情的开销,它也(略微)变慢了。最后,使用process.stdout.write 可以让阅读您的代码的人清楚地知道您打算在标准输出上输出数据,而留下的不仅仅是调试行(通常是console.log)在代码中。 【参考方案1】:

我想 Apache 用户不知道node 命令是什么。如果我是对的,请尝试写入 php 文件:

<full path to node> beerlist.nd

而不是

node beerlist.nd

获取在终端which node中运行的节点的完整路径

【讨论】:

请注意,使用 Bluehost 共享主机,从 PHP 调用未知的可执行文件不会产生错误行,所以要小心! 有没有办法在 php 中而不是在终端中获取节点的完整路径?这样我就不需要每次升级 nodejs 或推送到生产服务器时更新我的​​ php 文件。 @smohadjer,您可以尝试在 PHP 中执行此命令:"$(which node)" beerlist.nd。参见例如***.com/q/3437514/1079869 了解更多信息。

以上是关于从 PHP 调用 node.js 脚本不返回任何内容的主要内容,如果未能解决你的问题,请参考以下文章

节点 server.js 不返回任何内容

node.js 从脚本调用函数来更新 UI

是否可以在不调用“节点”的情况下运行 Node.js 脚本?

Node.js 从函数返回一个承诺

从 Node JS 连接 Redshift 时无法返回任何值

如何从 Paypal IPN 传输到 Node.JS?