Laravel作业将exec()错误转储到命令行而不是$ output

时间:2017-10-28 19:40:45

标签: php laravel-5 laravel-5.2

我正在尝试在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();
}

1 个答案:

答案 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.