使用 exec() 在 PHP 中执行 nodejs 脚本文件
Executing nodejs script file in PHP using exec()
在我的应用程序中,我想从 PHP 执行一个 Node.JS 文件,该文件又向另一个 PHP 文件发出 HTTP 请求。
简而言之,这就是我正在做的过程。
PHP 文件--->调用-->Nodejs文件--->处理数据-->并向-->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)
)
- 检查模块是否安装(
npm install
)
- 运行
exec
节点应用当前工作目录:
exec("cd ". dirname($nodeJsPath). " && node nodefunc.js 2>&1", $out, $err);
您的目标是在更改目录后执行节点命令。因此,您将需要通过 PHP exec() 函数 运行 多个顺序命令。
命令:
cd /var/www/html/projectfolder/js
node nodefunc.js 2>&1
这可以通过在命令之间添加 && 或 ; 来实现。
$ret = exec("cd /var/www/html/projectfolder/js; node nodefunc.js 2>&1", $out, $err);
我终于明白了。它只是忽略了 NODE_PATH
变量,原因不明:(
在 Nodejs 文件中,我必须像这样给出模块的绝对路径:
var request = require("/usr/lib/node_modules/request");
在我的应用程序中,我想从 PHP 执行一个 Node.JS 文件,该文件又向另一个 PHP 文件发出 HTTP 请求。
简而言之,这就是我正在做的过程。
PHP 文件--->调用-->Nodejs文件--->处理数据-->并向-->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)
)
- 检查模块是否安装(
npm install
) - 运行
exec
节点应用当前工作目录:
exec("cd ". dirname($nodeJsPath). " && node nodefunc.js 2>&1", $out, $err);
您的目标是在更改目录后执行节点命令。因此,您将需要通过 PHP exec() 函数 运行 多个顺序命令。
命令:
cd /var/www/html/projectfolder/js
node nodefunc.js 2>&1
这可以通过在命令之间添加 && 或 ; 来实现。
$ret = exec("cd /var/www/html/projectfolder/js; node nodefunc.js 2>&1", $out, $err);
我终于明白了。它只是忽略了 NODE_PATH
变量,原因不明:(
在 Nodejs 文件中,我必须像这样给出模块的绝对路径:
var request = require("/usr/lib/node_modules/request");