使用 exec() 在 PHP 中执行 nodejs 脚本文件

Posted

技术标签:

【中文标题】使用 exec() 在 PHP 中执行 nodejs 脚本文件【英文标题】:Executing nodejs script file in PHP using exec() 【发布时间】:2017-01-23 03:47:49 【问题描述】:

在我的应用程序中,我想从 php 执行一个 Node.JS 文件,该文件又向另一个 PHP 文件发出 HTTP 请求。

简而言之,这就是我正在做的过程。

PHP文件--->调用-->Nodejs文件--->处理数据-->向http请求-->PHP文件

当我通过终端运行 nodejs 文件时,它成功地向另一个 PHP 文件发出 http 请求,我得到了我想要的。

但是,当我尝试通过 PHP 运行 nodejs 文件时,nodejs 文件无法找到某些模块。

我的 PHP 代码:

$nodeJsPath = '/var/www/html/projectfolder/js/nodefunc.js';

$ret = exec("node ".$nodeJsPath.' 2>&1', $out, $err);

这是我得到的错误:

Array
(
    [0] => module.js:457
    [1] =>     throw err;
    [2] =>     ^
    [3] => 
    [4] => Error: Cannot find module 'some_module'
    [5] =>     at Function.Module._resolveFilename (module.js:455:15)
    [6] =>     at Function.Module._load (module.js:403:25)
    [7] =>     at Module.require (module.js:483:17)
    [8] =>     at require (internal/module.js:20:19)
    [9] =>     at Object.<anonymous> (/var/www/html/projectfolder/js/nodefunc.js:5:9)
    [10] =>     at Module._compile (module.js:556:32)
    [11] =>     at Object.Module._extensions..js (module.js:565:10)
    [12] =>     at Module.load (module.js:473:32)
    [13] =>     at tryModuleLoad (module.js:432:12)
    [14] =>     at Function.Module._load (module.js:424:3)
)

【问题讨论】:

我可以知道为什么投反对票以及这个问题有什么问题吗? 从 CLI 运行命令时是否有效? 是的,从终端执行时它确实运行正常 【参考方案1】:

您的目标是在更改目录后执行节点命令。因此,您需要通过 PHP exec() 函数运行多个顺序命令。

命令:

    cd /var/www/html/projectfolder/js node nodefunc.js 2&gt;&amp;1

这可以通过在命令之间添加 &&; 来实现。

$ret = exec("cd /var/www/html/projectfolder/js; node nodefunc.js 2>&1", $out, $err);

【讨论】:

【参考方案2】:

我终于明白了。由于未知原因,它只是忽略了NODE_PATH 变量:(

在 Nodejs 文件中,我必须像这样给出模块的绝对路径:

var request = require("/usr/lib/node_modules/request");

【讨论】:

【参考方案3】:
    检查模块是否安装(npm install) 在节点应用当前工作目录中运行exec
exec("cd ". dirname($nodeJsPath). " && node nodefunc.js 2>&1", $out, $err);

【讨论】:

嗨..听起来可能有点幼稚,但我对nodejs不太熟悉,我应该在哪里执行npm install,因为我可以在此路径中看到那些已安装的模块文件夹/usr/lib/node_modules跨度> 即使在exec 命令中更改目录后,我仍然遇到同样的错误 你需要运行 npm install 到包含你的节点项目的文件夹中(你的 package.json 文件的项目) 我的其实不是一个node项目,它是一个完全用PHP编写的codeigniter项目,只有一个带有nodejs代码的js文件,因为我只能通过使用nodejs来实现一个特定的功能 我已经在全球范围内安装了这些模块,并且 package.json 位于此文件夹中:/usr/lib/node_modules/npm/package.json。我不知道该怎么做

以上是关于使用 exec() 在 PHP 中执行 nodejs 脚本文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 curl 与 exec nodejs

Docker / NodeJS: "exec: \"-d\": $PATH 中找不到可执行文件"

无法使用 PHP shell_exec() 执行 telnet 命令

LINUX+NGINX下的PHP shell_exec()函数执行linux命令 2019-08-08

PHP - 使用 Exec 执行带有用户定义参数的 Jar 文件

PHP协程:并发 shell_exec