以下在用户 xyz 的命令行上可以正常工作:
/opt/local/bin/phantomjs --version
1.9.1
但是,在 PHP 中,对于同一个用户(xyz),我得到一个错误代码 5
exec('/opt/local/bin/phantomjs --version', $o, $r)
echo $r
我正在使用 MAMP,并且 exec() 通常可以正常工作。如果有人知道如何调试这个,我会非常感激!
感谢 Amal Murali 为我指明了正确的方向!
这也记录在 mac osx 上的 exec() 命令返回 5中,并且可以通过取消设置 DYLD_LIBRARY_PATH 来修复。
以下命令将起作用:
exec('unset DYLD_LIBRARY_PATH ; /opt/local/bin/phantomjs --version', $o, $r)
echo $r
干杯,
阿尔伯特。
很可能是环境变量的问题。macports 的一个常见问题是使用 OSX 附带的 'stock' apachectl(位于 /usr/sbin/apachectl)而不是位于 /opt/local/apache2/bin/apachectl 的 macports apachectl。
在大多数情况下,库存版本似乎可以正常工作。但是,只有 macports 版本会建立正确的环境(即,使用 /opt/local/apache2/bin/envvars,并正确设置 DYLD_FALLBACK_LIBRARY_PATH。
如果您运行sudo apachectl
以控制 apache,您可能正在运行 apachectl 的股票版本。
您可能想要删除它(或将其重命名为 /usr/sbin/apachectl.orig)并符号链接而不是 macports 版本:
mv /usr/bin/apachectlapachectl /usr/bin/apachectlapachectl.orig
ln /opt/local/apache2/bin/apachectl /usr/bin/apachectl
如果您仍然遇到问题,那么您可能需要深入研究 apache 使用的环境变量(并因此传递给 php)。
2>&1
通过在命令末尾附加来重定向输出,如下所示:
exec('/opt/local/bin/phantomjs --version 2>&1', $o, $r);
var_dump($r);
说将2>&1
标准错误发送到标准输出也被重定向的地方。有关更多信息,请参阅此答案。