Как записать вывод первой команды, а затем выполнить следующую команду в PHP? - PullRequest
0 голосов
/ 16 января 2020

У меня есть команда, из которой я выполняю функцию 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-интеграции '. $ processId. ' в realpath (Yii :: $ app-> basePath). «/../../Uploads/first_log.log.

Но после запуска этого процесса я хочу отправить электронное письмо о состоянии первой команды. Прямо сейчас я получаю статус In-Progress , что означает, что $ nextCommand не получает выполнение после того, как первый завершил выполнение (Здесь в моем случае я хочу статус, который должен быть как успех, так и неудача который был обновлен в базе данных первой командой). Если я удалю & echo $! тогда это не будет регистрировать вывод / ошибку в файл журнала, который необходим.

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Вот изменение кода, которое я сделал для решения этой проблемы.

$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); 

Для удобства чтения я назначил команды переменным и, используя ';' , я выполнил оба Команды одна за другой.

0 голосов
/ 16 января 2020

Этот сегмент кода 2>&1 & echo $! && должен быть 2>&1 && echo $! && (посмотрите на отсутствующий символ & после &1.

Причина в том, что в конце только один символ &, команда будет работать в фоновом режиме и сразу же вернуться. Таким образом, ваша вторая команда будет запущена, когда первая команда еще не завершена.

...