mik*_*n32 5 php bash shell path npm
我试图npm从 PHP 网页运行,但它永远不会运行。我总是得到退出代码 127 并且没有输出。经过一些测试后,我将问题范围缩小到了 shebang,其中npm如下所示:
#!/usr/bin/env node
Run Code Online (Sandbox Code Playgroud)
相当标准,但我做了一些测试代码:
<?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);
Run Code Online (Sandbox Code Playgroud)
并在我的浏览器中得到以下输出:
string(0) ""
int(127)
string(6) "v8.4.0"
int(0)
string(28) "Written by Jean-loup Gailly."
int(0)
Run Code Online (Sandbox Code Playgroud)
我catch_workers_output在 PHP-FPM 配置中启用并在 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: ""
Run Code Online (Sandbox Code Playgroud)
我还尝试exec("which node")从 Web 服务器运行并在 PHP 日志中看到以下内容:
[18-Aug-2017 15:31:12] WARNING: [pool web] child 27873 said into stderr: "which: no node in ((null))"
Run Code Online (Sandbox Code Playgroud)
我尝试运行var_dump(exec('echo $PATH'))并得到以下输出:
string(28) "/usr/local/bin:/bin:/usr/bin"
Run Code Online (Sandbox Code Playgroud)
这似乎与env命令如何处理路径有关。我尝试使用fastcgi_param PATH指令手动设置它nginx.conf,但它没有改变上面的输出。
单独运行env并打印输出如下所示,没有 PATH 条目:
Array
(
[0] => USER=nginx
[1] => PWD=/var/www/html
[2] => SHLVL=1
[3] => HOME=/var/cache/nginx
[4] => _=/bin/env
)
Run Code Online (Sandbox Code Playgroud)
我使用的是基于 RHEL 的发行版,禁用了 SELinux,通过 Nginx 1.12.1 的 UNIX 套接字运行 PHP-FPM 5.6.31。/usr/local/bin/node是一个具有 775 权限的符号链接/usr/local/nodejs/bin/node。出于测试目的, 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)
Run Code Online (Sandbox Code Playgroud)
您需要设置PATH环境/etc/php5/fpm/pool.d/www.conf以包含/usr/local/bin/node.
在 ubuntu 发行版中,它被注释掉了:
;env[PATH] = /usr/local/bin:/usr/bin:/bin
Run Code Online (Sandbox Code Playgroud)
所以
env[PATH] = /usr/local/bin/node
Run Code Online (Sandbox Code Playgroud)
应该做这项工作。RHEL 应该不会有很大的不同,但即使该行不存在,您也可以随时添加它。
不要忘记重新启动 php-fpm。
如果没有任何效果,您可以在调用时显式设置路径npm:
exec('PATH=$PATH:/usr/local/bin/node npm');
Run Code Online (Sandbox Code Playgroud)
但这是最后的手段,我不会推荐它。