我通过PhantomJS在我的远程服务器上安装了npm,并将其添加到.bashrc:PATH=~/node/bin:$PATH
如果我在ssh控制台中运行phantomjs -v
,那么我会得到预期的结果:1.9.7
现在,当我尝试在PHP脚本中使用它时:
<?
putenv("PATH=~/node/bin:$_ENV[PATH]");
echo shell_exec('echo $PATH');
echo shell_exec('phantomjs -v 2>&1');
我收到此错误(并且不是sh: phantomjs: command not found
):
~/node/bin:/bin:/usr/bin
/usr/bin/env: node: No such file or directory
我可以使用完整路径~/node/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs
来获得正确的响应。
但问题是:为什么php exec()和控制台的行为有所不同? 是因为有些sh / bash?也许他们正在使用不同的ENV?
答案 0 :(得分:0)
PHP以不同的用户apache
或nginx
运行。这些用户没有homedir,因此路径~/node/bin
不存在。请添加到nodejs的PATH全局路径,然后运行脚本。
答案 1 :(得分:0)
node.js或PHP甚至CRON的脚本使用FULL PATH名称来避免这些错误。根据您的配置,PHP以用户“www-data”(例如:ubuntu)或“nobody”运行。因此路径不存在。
注意:如果查看/ etc /文件夹,可以看到使用FULL PATHS的脚本示例
答案 2 :(得分:0)
shell_exec
没有获得当前流程的ENV变量。
虽然
可以使用passthru
putenv("HELLO=world");
passthru("echo \$HELLO");
// world
值得注意的是passthru
也接收STDIN并直接写入STDOUT和STDERR