#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 на стандартный вывод.