如何记录第一个命令的输出然后在 PHP 中执行下一个命令?

How to log output of first command and then execute next command in PHP?

我在执行 PHP 函数并将输出写入日志文件的地方有命令,在成功后我想 运行 下一个命令应该发送有关状态的电子邮件第一个命令。

例如

$nextCommand = 'php _protected/yii xyz-integration/job-status-email ' . $processId . ' >'.realpath(Yii::$app->basePath) . '/../../uploads/second_log.log 2>&1 & echo $!';
$command = 'php _protected/yii xyz-integration ' . $processId . ' >'.realpath(Yii::$app->basePath) . '/../../uploads/first_log.log 2>&1 & echo $! && '.$nextCommand;
exec($command, $output);

通过这样做,我能够回显 php _protected/yii xyz-integration ' 的输出。 $进程号。 'realpath(Yii::$app->basePath) 。 '/../../uploads/first_log.log

但是 运行完成这个过程后,我想发送一封关于第一个命令状态的电子邮件。现在我的状态为 In-Progress 这意味着 $nextCommand 在第一次完成执行后没有执行(在我的例子中我想要应该像成功或失败的状态,由第一个命令在数据库中更新)。如果我删除 & echo $!那么它不会将 output/error 记录到必要的日志文件中。

这段代码段2>&1 & echo $! &&应该是2>&1 && echo $! &&(看&1后缺少的&字符。

原因是最后只有一个 & 字符,该命令将在后台 运行 并立即 return 。以便在第一个命令尚未完成时启动第二个命令。

这是我为解决问题所做的代码更改。

$nextCommand = 'php _protected/yii xyz-integration/job-status-email ' . $processId . ' >'.realpath(Yii::$app->basePath) . '/../../uploads/second_log.log 2>&1 & echo $!';
$command = 'php _protected/yii xyz-integration ' . $processId . ' >'.realpath(Yii::$app->basePath) . '/../../uploads/first_log.log 2>&1 ';
exec($command .' ; '. $nextCommand); 

出于可读性目的,我将命令分配给变量并使用 ';' 我一个接一个地执行了这两个命令。