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


How to return a database dump as a download

我正在为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, @myself

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

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

我打赌这是由于php不允许运行pg_dump,但我怎么能让系统允许它能够运行它?


编辑3, @myself

在解决了pg_dump的问题后(我在我的系统中添加了apache用户www-data到sudoers列表中,这就解决了这个问题)。另外,为要写入的目录设置正确的权限也很方便。)现在我得到了db_Dump。SQL为纯文本,而不是另存为对话框。对此有什么想法吗?

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

第二,检查你的PHP脚本是否没有达到时间限制,因为转储可能会持续很长时间。

第三,您想要将整个转储读入内存?您可以很容易地达到内存限制,所以要逐个完成。在php。net中有一个例子,在read_manual:

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

事实证明,这都是由于我请求下载的方式。当您通过Ajax请求时,似乎不可能获得下载,因为返回的文件在调用的成功方法中被接受。在将其更改为指向该文件的直接链接后,我能够获得下载