我需要从网络控制器运行composer.phar update
。
我可以用这种方式运行各种常规命令(ls
,cp
等),但是当我调用phar文件时,我得到空输出。
我的代码如下:
class Maintenance_Controller
{
public function do_maintenance()
{
echo exec("/usr/bin/env php composer.phar", $out, $ret);
var_dump($out); // outputs -> array()
var_dump($ret); // outputs -> int(127)
}
}
127
表示路径不好,但我确定我在正确的目录中。
此外,这在使用php_cli包装器时也有效,所以它可能与www-data
用户有关吗? chmod 777
无济于事,我讨厌这样做。
我还使用了passthru()
,system()
和语法语法。我无法理解这不起作用的原因。我似乎无法通过exec()
代码之外的127
来电询问stderr或stdout。
我做错了什么?
是否有更好的方法可以在脚本中查询和执行.phar
个文件?
答案 0 :(得分:3)
<强>更新强>
当您的PATH系统变量中找不到给定命令且它不是内置shell命令时,/ bin / sh返回值127。
尝试使用exec('php composer.phar', $out, $ret);
并查看是否有效。您可能还需要使用php
的完整路径,如果它位于您可能从which php
获得的非标准位置。
我不确定你为什么在这里使用passthru
。我会使用exec
来更好地处理。
我在此处使用exec
而不是passthru
class Maintenance_Controller
{
public function do_maintenance()
{
exec("composer.phar update", $out, $ret);
if(!$ret) {
// handle success
} else {
// handle error
}
}
}
这样你就可以在$out
中按行输出所有输出以及shell返回值(如果没有则为0,否则为> 0)。如果你想真正想象,你可以循环$out
并扫描错误,然后构建和抛出异常。