PHP: Как получить сообщение об ошибке неудачной команды оболочки?

#php #bash #mysqldump

#php #bash #mysql

Вопрос:

Я выполняю следующую команду, чтобы создать резервную копию базы данных:

 $exec = exec("mysqldump --opt 
                        --user=$database_user 
                        --password=$database_pass 
                        --host=$database_host 
                        $database_name > $output_filename", $out, $status);
  

Чтобы проверить, не удалось ли mysqldump выполнить:

 if ($status == 0) {
   // OK
} else {
   // Error
   // How could I print the error message here ?
}
  

В случае, если что-то пойдет не так и mysqldump произойдет сбой, как я могу получить сообщение об ошибке?

Ответ №1:

Вы можете использовать proc_open (как также предложил Эмиль). ниже приведен несколько более полный пример того, как достичь того, чего вы хотите.

 $exec_command = "mysqldump --opt 
                    --user=$database_user 
                    --password=$database_pass 
                    --host=$database_host 
                    $database_name"

$descriptorspec = array(
                       0 => array("pipe", "r"),  // stdin pipe 
                       1 => array("file", $output_filename, "w"),  // stdout to file  
                       2 => array("pipe", "w")   // stderr pipe 
);

$proc = proc_open($exec_command, $descriptorspec, $pipes);

fwrite($pipes[0], $input); //writing to std_in
fclose($pipes[0]);

$err_string = stream_get_contents($pipes[2]); //reading from std_err
fclose($pipes[2]); 

$return_val = proc_close($proc);
  

Редактировать:

изменен вывод для записи в файл

Ответ №2:

Вам нужно будет использовать proc_open, если вы хотите прочитать stderr. Пример в руководстве должен заставить вас работать.

Комментарии:

1. или перенаправить на стандартный вывод и извлечь его из $output_filename , поскольку дамп в любом случае будет недействительным в случае ошибки.

2. 2>amp;1 перенаправляет stderr (по соглашению, дескриптор файла # 2) на стандартный вывод (дескриптор файла # 1)

Ответ №3:

Если вы используете shell_exec, добавьте 2> amp;1 к команде, она перенаправит STDERR на стандартный вывод.