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

23
在我的应用程序中,我想从PHP执行一个Node.JS文件,该文件又会向另一个PHP文件发出HTTP请求。
简而言之,这是我正在进行的过程。
PHP文件--->调用-->NodeJS文件--->处理数据--->并向-->PHP文件发起HTTP请求
当我通过终端运行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)
)

1
请问为什么会有人给这个问题点踩,有什么问题吗? - Abhinav
当从CLI运行命令时,它是否有效? - krampstudio
在终端执行时,它确实可以正常运行。 - Abhinav
3个回答

11

我终于弄懂了,只是因为某些未知原因忽略了NODE_PATH变量 :(

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

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

值得一提的是,这个解决方案是由@krampstudio提出的 :) - nssmart

9
您的目标是在更改目录后执行节点命令。因此,您需要通过PHP exec()函数运行多个连续命令。
命令:
1. cd /var/www/html/projectfolder/js 2. node nodefunc.js 2>&1
可以通过在命令之间添加&&;来实现此功能。
$ret = exec("cd /var/www/html/projectfolder/js; node nodefunc.js 2>&1", $out, $err);

5
  1. 检查模块是否已安装 (npm install)
  2. 在节点应用程序的当前工作目录中运行exec
exec("cd ". dirname($nodeJsPath). " && node nodefunc.js 2>&1", $out, $err);

嗨..这可能听起来有点天真,但我不太熟悉Node.js,我应该在哪里执行npm install,因为我可以在此路径/usr/lib/node_modules中看到已安装的模块文件夹。 - Abhinav
你需要在包含你的 Node 项目(即包含 package.json 文件的项目)的文件夹中运行 npm install。 - krampstudio
我的项目实际上不是一个Node项目,而是完全由PHP编写的CodeIgniter项目,只有一个包含Node.js代码的JS文件,因为我只能通过使用Node.js来实现特定的功能。 - Abhinav
我已经全局安装了这些模块,而 package.json 文件位于此文件夹中:/usr/lib/node_modules/npm/package.json。我不知道该怎么做。 - Abhinav
2
我认为问题是因为你的依赖项是全局安装而不是本地安装,因为我不认为php的exec知道环境变量NODE_PATH - krampstudio
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接