Intereting Posts
Сохраняйте значение переключателя пользовательского поля в корзине и отобразите его на странице корзины. Карты Google и как передать переменную с php-страницы на другую, если эта страница php не включена Использование Response в том же файле PHP Как вызвать файл php, расположенный за пределами public_html Получить конечное значение многомерного массива Неопределенная константа класса 'MYSQL_ATTR_INIT_COMMAND' в константе неопределенного класса (PHP 5.5.3) 403 Запрещено, если вход содержит «скрипт», PHP Как исправить Уведомление: Неопределенная переменная: Функция PHP для проверки времени между заданным диапазоном? В PHP, как я могу получить Timezone из офсетной линии и страны? Обновление информации о пользователе в WordPress с помощью Woocommerce? PHP. Внешний класс / библиотека доступен из apache, но не из phpunit Symfony2: динамическая генерация встроенной формы PHP: получить ключи от независимых массивов Различия между ORM / DAO / DataMapper / ActiveRecord / TableGateway?

mysqldump через PHP

У меня есть 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 сообщение о том, что логин завершился неудачно. Я хочу захватить такие сообщения об ошибках и отобразить их. Любые идеи о том, как это сделать?

Solutions Collecting From Web of "mysqldump через PHP"

Вы должны проверить третий параметр функции 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() не может этого сделать. Есть несколько решений, все уже найдено, так что это всего лишь сводка.

  1. Решение от Jon : регистрировать ошибки из mysqldump и обрабатывать их отдельно (не может применяться для каждой команды).
  2. Перенаправить выходы в отдельные файлы, то есть mysqldump ... 2> error.log 1> dump.sql и прочитать журнал ошибок отдельно, как в предыдущем решении.
  3. Решение от JazZ : напишите дамп как подоболочку и перенаправьте stderr подоболочки на stdout, который может установить php exec() в переменную $output .
  4. Решение от Pascal : лучше использовать proc_open() вместо exec() потому что мы можем получать stdout и stderr отдельно (непосредственно из каналов).

напишите ниже код, чтобы получить экспорт базы данных в файл .sql.

 <?php exec('mysqldump --user=name_user --password=password_enter --host=localhost database_name > filenameofsql.sql'); ?>