如何将数据库转储作为下载返回

时间:2011-11-15 09:04:53

标签: php postgresql

我正在研究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 ,@ stepvls:

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 ,@ myself

我已经能够获得一个返回值,似乎检查给出的命令是否为'dump'从未到达。我解决了这个问题,现在我在pg_dump命令上出错了。我现在得到了

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

我敢打赌这是因为php不允许运行pg_dump,但我怎么能让系统允许它运行它呢?


编辑3 ,@ myself

解决了pg__dump的问题后(​​我在我的系统上添加了www-data,Apaches用户,到sudoers列表,这解决了问题。同时在写入目录上设置正确的权限也很方便。)I现在将db_Dump.sql作为纯文本而不是另存为对话框。有什么想法?

2 个答案:

答案 0 :(得分:1)

首先检查是否在光盘上创建了转储文件。

其次,检查您的PHP脚本是否未达到时间限制,因为转储可能会持续很长时间。

第三,你想把整个转储读入内存吗?您可以轻松达到内存限制,因此可以逐个进行。在php.net上,您有fread manual中的示例:

$handle = fopen("http://www.example.com/", "rb");
$contents = '';
while (!feof($handle)) {
  $contents .= fread($handle, 8192);
}
fclose($handle);

答案 1 :(得分:0)

事实证明,这完全归功于我如何请求下载。当您通过Ajax请求时,似乎无法下载,因为返回的文件在调用的成功方法中被接受。将此更改为文件的直接链接后,我可以下载。