我试图从一个PHP网页中运行npm
,但它从未运行。我总是得到一个代码为127的退出代码和没有输出。经过一些测试,我将问题缩小到npm
中的shebang,它看起来像这样:
#!/usr/bin/env node
相当标准,但我写了一些测试代码:
<?php
$result = exec("/usr/bin/env node --version", $output, $exit);
var_dump($result);
var_dump($exit);
$result = exec("node --version", $output, $exit);
var_dump($result);
var_dump($exit);
$result = exec("/usr/bin/env gzip --version", $output, $exit);
var_dump($result);
var_dump($exit);
我在浏览器中看到了这个输出:
string(0) ""
int(127)
string(6) "v8.4.0"
int(0)
string(28) "Written by Jean-loup Gailly."
int(0)
我在PHP-FPM配置中启用了catch_workers_output
,并在PHP日志中看到了以下内容:
[18-Aug-2017 15:15:35] WARNING: [pool web] child 27872 said into stderr: "/usr/bin/env: "
[18-Aug-2017 15:15:35] WARNING: [pool web] child 27872 said into stderr: "node"
[18-Aug-2017 15:15:35] WARNING: [pool web] child 27872 said into stderr: ": No such file or directory"
[18-Aug-2017 15:15:35] WARNING: [pool web] child 27872 said into stderr: ""
我还尝试从Web服务器上运行 exec("which node")
,并在PHP日志中看到了以下内容:
[18-Aug-2017 15:31:12] WARNING: [pool web] child 27873 said into stderr: "which: no node in ((null))"
我尝试运行
var_dump(exec('echo $PATH'))
,并得到以下输出:string(28) "/usr/local/bin:/bin:/usr/bin"
这似乎与env
命令如何处理路径有关。我尝试在nginx.conf
中使用fastcgi_param PATH
指令手动设置它,但对上述输出没有产生任何变化。
仅运行env
并打印输出结果如下,没有PATH条目:
Array
(
[0] => USER=nginx
[1] => PWD=/var/www/html
[2] => SHLVL=1
[3] => HOME=/var/cache/nginx
[4] => _=/bin/env
)
我使用基于RHEL的发行版,已禁用SELinux,在Nginx 1.12.1上通过UNIX套接字运行PHP-FPM 5.6.31。
/usr/local/bin/node
是指向 /usr/local/nodejs/bin/node
的符号链接,具有775权限。出于测试目的,nginx用户拥有/usr/local/nodejs
目录及其所有后代的所有权。有什么建议吗?请注意,如果我从CLI(作为nginx用户)运行PHP代码,则按预期工作,因此这肯定与CGI / FPM环境有关。
$ su -s "/bin/sh" -c "/var/www/html/test.php" nginx
string(6) "v8.4.0"
int(0)
string(6) "v8.4.0"
int(0)
string(28) "Written by Jean-loup Gailly."
int(0)
exec("which node", $output, $exit);
时会发生什么? - chiliNUTnode
运行它,所以它必须在$PATH
中。在 CLI 中运行良好($_SERVER["PATH"]
在 FPM 中返回null
,在 CLI 上似乎很好)。 - miken32node
运行它,则必须在$path
中...但我非常确定which
只会浏览您的路径中的所有内容,直到找到它或放弃,所以这很奇怪。 - chiliNUT_
变量,shell被调用为/bin/env
。当您运行exec("/bin/env node --version", $output, $exit);
时会发生什么? - piarston/usr/bin/env
是一个符号链接。 - miken32