Ошибка: Failed to parse the Currency Converter XML document.
$18 054.97
|
Ошибка: Failed to parse the Currency Converter XML document.
$3 124.58
|
Ошибка: Failed to parse the Currency Converter XML document.
$1 267.61
|
Удалённое восстановление баз MySQL с помощью PHP
Проблема
Как импортировать большой SQL-скрипт (дамп базы данных MySQL для форума phpBB), если обычными споcобами (загрузка через web-интерфейс phpMyAdmin, Backup cPanel) проблематична, особенно на модемном соединении.
Решение
Можно попробовать через MySQL клиент типа SQLyog, MySQL-Front и т.д., но опять же не факт, что это закончится благополучно. Минимальное время 1 (обычно 2-5) секунда на передачу и выполнение одной SQL-команды (а если их тысяч пять? загрузка займёт весь рабочий день, плюс нужно следить, не упала ли связь). Можно импортировать файл дампа с помощью phpMyAdmin или встроенных средств сPanel (что по сути один фиг), но закачивать большие объёмы данных методом POST из формы не очень надёжно и нецелесообразно метод POST подходит для более рутинных задач, типа «Введите имя» и т.д.
Перепробовав все перечисленные способы, я выяснил, что основная проблема непрерывная передача 9 Мб файла. Передать файл, говорите? Так это же делается через старый добрый FTP! Можно залить дамп на FTP (не волнуясь о целостности, ведь можно и докачать) и попросить админов восстановить базу, но не факт, что вам помогут, тем более на бесплатном хостинге. Хотя... где вы видели бесплатный хостинг с MySQL? Стыд и срам тому программисту, который каждый раз трясёт суппорт своими недоделками.
Пройдя через всё это, решил написать простенькую утилиту на PHP, которая будет читать SQL-файл построчно, точнее покомандно: выбирает команду (ограниченную точкой-с-запятой, исполняет её, и так далее по циклу). То есть все операции происходят внутри сервера, без участия клиента. Скорость бешеная, 9 Мб SQL-скрипт за 5 секунд!!! Ессесно, файлик должен лежать там же, где скрипт.
Минусы
Занимает большое количество ресурсов сервера, весь файл читается в память. Можно усовершенствовать, читая из файлового только отдельные SQL-команды. Будем считать это отправной точкой для сложной утилиты восстановления БД на сервере MySQL.
<?php
mysql_connect(«localhost», «login», «password»);
mysql_select_db («database»);
if (!file_exists($fname)) die («Файл $fname не существует!»);
$fp = fopen ($fname, «r»);
$buffer = fread($fp, filesize($fname));
fclose ($fp);
$prev = 0;
while ($next = strpos($buffer,«;»,$prev+1))
{
$i++;
$a = substr($buffer,$prev+1,$next-$prev);
mysql_query($a);
$prev = $next;
}
echo «Выполнено $i команд»;
?>
Что-то вроде этого.
$fname имя файла SQL-дампа
$prev позиция предыдущей «;»
$next позиция следующей «;» начиная с позиции $prev
Вызываем скрипт примерно так: sqlbackup.php?fname=backup.sql, будет выполнен файл backup.sql. В конце выводится число выполненных команд. Я замеряю время выполнения для интереса, здесь для упрощения убрал. Каждый может усложнить, как считает нужным, это всего лишь простое решение повседневной задачи за пять минут.