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

Php 如何将数据库转储作为下载返回,php,postgresql,Php,Postgresql,我正在为PostgreSQL数据库开发一个函数,当客户端发布数据库转储时,转储将作为下载提供。该快照随后可用于恢复具有的数据库。然而,我似乎不知道怎么做。当用户按下按钮时,将对服务器进行AJAX调用,服务器将执行以下代码: if($_POST['command'] == 'dump'){ $dump = $table->Dump(); header("Content-type: application/octet-stream"); header('Content-

我正在为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,我自己

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

sh: cannot create ../database/db_Dump.sql: Permission denied
我打赌这是因为php不被允许运行pg_dump,但是我怎样才能让系统允许它运行它呢


编辑3,@我自己


在解决了pg__转储的问题后(我在sudoers列表中添加了www数据,我的系统上的Apaches user,这解决了问题。同时,在要写入的目录上设置正确的权限也很方便。)我现在将db_dump.sql作为纯文本,而不是另存为对话框。对此有什么想法吗?

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

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

第三,您想将整个转储读取到内存中吗?你很容易达到内存限制,所以一部分一部分地去做。在php.net上,您有以下示例:


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

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

第三,您想将整个转储读取到内存中吗?你很容易达到内存限制,所以一部分一部分地去做。在php.net上,您有以下示例:


事实证明,这都是因为我是如何要求下载的。当您通过Ajax请求下载时,似乎不可能获得下载,因为调用的success方法接受了返回的文件get。将此更改为文件的直接链接后,我能够获得下载。

结果表明,这一切都是由于我请求下载的事实。当您通过Ajax请求下载时,似乎不可能获得下载,因为调用的success方法接受了返回的文件get。将此更改为文件的直接链接后,我就可以下载了。

您的www用户是否可以执行
pg_dump
?是的,这是一个系统管理功能,因此不是每个用户都可以这样做…因此如果您创建一个空php文件并调用此
exec(
将有转储?读取转储文件并将其写入电线的代码在哪里?一个很好的观点是stevevls…它还不在那里..>。您的www用户是否可以执行
pg_dump
?是的,这是一个系统管理功能,因此不是每个用户都可以这样做…因此如果您创建一个空的php文件并调用此
exec(
将有转储?读取转储文件并将其写入线路的代码在哪里?很好的一点是stevevls…它还不在那里..>。一次读入内存的整个文件只是一个带有有限数据库的测试设置(大约30-40个条目)。我怀疑这会填满内存。但我想公平地说,这仍然是一个值得记住的好提示。一次读入内存的整个文件只是一个带有有限数据库(大约30-40个条目)的测试设置。我怀疑这会填满内存。但我想公平地说,这仍然是一个值得记住的好提示。
$handle = fopen("http://www.example.com/", "rb");
$contents = '';
while (!feof($handle)) {
  $contents .= fread($handle, 8192);
}
fclose($handle);