Как вернуть дамп базы данных при загрузке - PullRequest
1 голос
/ 15 ноября 2011

Я работаю над функцией для базы данных PostgreSQL, чтобы, когда клиент выдает дамп базы данных, дамп предлагается для загрузки.Этот моментальный снимок впоследствии можно будет использовать для восстановления базы данных с помощью.Тем не менее, я не могу понять, как это сделать.Когда пользователь нажимает кнопку, выполняется AJAX-вызов на сервер, для которого сервер выполняет следующий код:

if($_POST['command'] == 'dump'){
    $dump = $table->Dump();
    header("Content-type: application/octet-stream");
    header('Content-Disposition: attachment; filename=/"'.$dump.'/"');
}

Где $table->Dump() выглядит следующим образом:

public function Dump(){
    $filename = dirname(__FILE__)."/db_Dump.out";
    exec("pg_dump ".$this->name." > $filename");
    return $filename;
}

Дамп еще не сделан.Любые советы по этому поводу?

Этот подход, однако, не работает.Я думал, что установки заголовков будет достаточно, чтобы вызвать загрузку, но, видимо, я ошибся.Итак, каков будет правильный способ создания загрузки?


Редактировать 1 , @stevevls:

if($_POST['command'] == 'dump'){
    $dump = $table->Dump();
    $fh = fopen($dump, 'r') or die("Can't open file");
    header("Content-type: application/octet-stream");
    header('Content-Disposition: attachment; filename=/"'.$dump.'/"');
    $dumpData = fread($fh, filesize($fh));
    fclose($fh);
    echo $dumpData;
}

Я все еще не получаю ничего, какхотя загрузка.


Редактировать 2 , @ себя

Мне удалось получить возвращаемое значение, казалось, что проверка, если команда далабыл «свалка» никогда не был достигнут.Я исправил это, и теперь я получаю сообщение об ошибке в команде pg_dump.Теперь я получаю

sh: cannot create ../database/db_Dump.sql: Permission denied

Могу поспорить, что это связано с тем, что php не разрешено запускать pg_dump, но как я могу заставить систему разрешить ее запуск?


Редактировать 3 , @ себя

После решения проблемы с помощью pg__dump (я добавил www-data, пользователя Apache в моей системе, в список sudoers, который устранил проблему. Такжеустановка правильных разрешений для каталога для записи также удобна.) Теперь я получаю db_Dump.sql в виде простого текста вместо диалогового окна сохранения как.Есть идеи на этот счет?

Ответы [ 2 ]

1 голос
/ 15 ноября 2011

Прежде всего проверьте, был ли создан файл дампа на диске.

Во-вторых, проверьте, не достиг ли ваш PHP-скрипт ограничения по времени, потому что создание дампа может длиться долго.

В-третьих, вы хотите прочитать весь дамп в память?Вы можете легко достичь предела памяти, так что делайте это по частям.На php.net у вас есть пример в руководстве по фреду :

$handle = fopen("http://www.example.com/", "rb");
$contents = '';
while (!feof($handle)) {
  $contents .= fread($handle, 8192);
}
fclose($handle);
0 голосов
/ 21 ноября 2011

Оказывается, все это было связано с тем, как я запрашивал загрузку. Кажется, что невозможно получить загрузку, когда вы запрашиваете ее через Ajax, так как возвращенный файл становится принятым в методе успеха вызова. Изменив это на прямую ссылку на файл, я смог загрузить файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...