我正在尝试在Laravel中构建一个简单的部署程序,它将接收一个webhook,执行部署并存储一些关于所述部署的信息(来自钩子)。
我正在使用Laravel 5.2作业调度程序执行以下操作:
public function deploy()
{
$result = 0;
$output = array();
exec('cd ' . $this->deploymentMapping->full_file_path . '; git pull', $output, $result);
return array(
'result' => $result,
'output' => $this->outputToString($output)
);
}
我对exec()
函数的理解是,这不应该直接转储任何错误,而是将它们存储在$output
中。
但是,当我在命令行中在我的服务器上运行php artisan queue:work
时,为了测试作业调度程序,我只是立即将fatal: Not a git repository (or any of the parent directories): .git
转储到命令行输出中。 这个git错误是正确的,但它正在使这项工作失败"好像exec()
引发了一个错误。它是否正确?我的工作应该是以自己的方式报告错误,如下所示:
public function handle()
{
$deploymentAttempt = new DeploymentAttempt();
$deploymentAttempt->deployment_id = $this->deploymentID;
$gitResponse = $this->deployer->deploy(); //the above function
$deploymentAttempt->success = !($gitResponse['result'] > 0);
$deploymentAttempt->message = $gitResponse['output'];
$deploymentAttempt->save();
}
答案 0 :(得分:1)
这是因为PHP的exec
没有提供单独捕获stderr
输出的简单方法。
您还需要捕获stderr
。
将stderr
重定向到stdout
应该可以解决问题。将2>&1
附加到命令的末尾。
exec('cd ' . $this->deploymentMapping->full_file_path . '; git pull 2>&1', $output, $result);
它将使用预期输出填充数组$output
,每个数组键一行。
要详细了解2>&1
的工作原理,您可以关注this thread.