SSH和PHP的不同行为

时间:2014-08-11 00:27:04

标签: php node.js shell ssh phantomjs

我通过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?

3 个答案:

答案 0 :(得分:0)

PHP以不同的用户apachenginx运行。这些用户没有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