У меня есть PHP-скрипт, который получает информацию о соединении с MySQL на удаленном сервере, и я хочу, чтобы он выполнял команду mysqldump
. Для этого я использую функцию php exec()
:
<?php exec("/usr/bin/mysqldump -u mysql-user -h 123.145.167.189 -pmysql-pass database_name > /path-to-export/file.sql", $output); ?>
Когда правильные данные для входа будут переданы ему, это будет работать абсолютно нормально. Тем не менее, у меня возникли проблемы с проверкой, выполняется ли она так, как ожидалось, и если она не выясняет, почему нет. Массив $output
возвращается как пустой, тогда как, если я запускаю команду непосредственно в командной строке, $output
сообщение о том, что логин завершился неудачно. Я хочу захватить такие сообщения об ошибках и отобразить их. Любые идеи о том, как это сделать?
Вы должны проверить третий параметр функции exec : &$return_var
.
$return_var = NULL; $output = NULL; $command = "/usr/bin/mysqldump -u mysql-user -h 123.145.167.189 -pmysql-pass database_name > /path-to-export/file.sql"; exec($command, $output, $return_var);
По соглашению в Unix процесс возвращает ничего, кроме 0, когда что-то идет не так .
И вы можете:
if($return_var) { /* there was an error code: $return_var, see the $output */ }
Поскольку эта строка перенаправляет вывод stdout > /path-to-export/file.sql
попробуйте это,
<?php exec("/usr/bin/mysqldump -u mysql-user -h 123.145.167.189 -pmysql-pass database_name", $output); /* $output will have sql backup, then save file with these codes */ $h=fopen("/path-to-export/file.sql", "w+"); fputs($h, $output); fclose($h); ?>
Я искал то же самое решение, и я вспомнил, что уже решил это пару лет назад, но забыл об этом.
Поскольку эта страница является высокой в Google для вопроса, вот как я это сделал:
<?php define("BACKUP_PATH", "/full/path/to/backup/folder/with/trailing/slash/"); $server_name = "your.server.here"; $username = "your_username"; $password = "your_password"; $database_name = "your_database_name"; $date_string = date("Ymd"); $cmd = "mysqldump --hex-blob --routines --skip-lock-tables --log-error=mysqldump_error.log -h {$server_name} -u {$username} -p{$password} {$database_name} > " . BACKUP_PATH . "{$date_string}_{$database_name}.sql"; $arr_out = array(); unset($return); exec($cmd, $arr_out, $return); if($return !== 0) { echo "mysqldump for {$server_name} : {$database_name} failed with a return code of {$return}\n\n"; echo "Error message was:\n"; $file = escapeshellarg("mysqldump_error.log"); $message = `tail -n 1 $file`; echo "- $message\n\n"; } ?>
с<?php define("BACKUP_PATH", "/full/path/to/backup/folder/with/trailing/slash/"); $server_name = "your.server.here"; $username = "your_username"; $password = "your_password"; $database_name = "your_database_name"; $date_string = date("Ymd"); $cmd = "mysqldump --hex-blob --routines --skip-lock-tables --log-error=mysqldump_error.log -h {$server_name} -u {$username} -p{$password} {$database_name} > " . BACKUP_PATH . "{$date_string}_{$database_name}.sql"; $arr_out = array(); unset($return); exec($cmd, $arr_out, $return); if($return !== 0) { echo "mysqldump for {$server_name} : {$database_name} failed with a return code of {$return}\n\n"; echo "Error message was:\n"; $file = escapeshellarg("mysqldump_error.log"); $message = `tail -n 1 $file`; echo "- $message\n\n"; } ?>
Это – log-error = [/ path / to / error / log / file] часть mysqldump, о которой я всегда забываю!
Решение, которое я нашел, это запустить команду в под-оболочке, а затем вывести stderr
в stdout
. Таким образом, $output
хорошо заполнен.
т.е.:
exec("(mysqldump -u$username -p$password $database $tables > $dump_name) 2>&1", $output, $result); var_dump($result); echo "<br />"; var_dump($output); echo "<br />";
Выход :
Int (6)
array (1) {[0] => string (46) "mysqldump: Не удалось найти таблицу:" table_name ""}
Надеюсь, поможет !
Поскольку exec()
извлекает только stdout
который перенаправляется на файл, у нас есть частичный или отсутствующий результат в файле, и мы не знаем почему. Мы должны получить сообщение от stderr
и exec()
не может этого сделать. Есть несколько решений, все уже найдено, так что это всего лишь сводка.
mysqldump
и обрабатывать их отдельно (не может применяться для каждой команды). mysqldump ... 2> error.log 1> dump.sql
и прочитать журнал ошибок отдельно, как в предыдущем решении. exec()
в переменную $output
. proc_open()
вместо exec()
потому что мы можем получать stdout
и stderr
отдельно (непосредственно из каналов). напишите ниже код, чтобы получить экспорт базы данных в файл .sql.
<?php exec('mysqldump --user=name_user --password=password_enter --host=localhost database_name > filenameofsql.sql'); ?>