从 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 脚本不返回任何内容的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在不调用“节点”的情况下运行 Node.js 脚本?