我正在为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请求时,似乎不可能获得下载,因为返回的文件在调用的成功方法中被接受。在将其更改为指向该文件的直接链接后,我能够获得下载