我正在研究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作为纯文本而不是另存为对话框。有什么想法?
答案 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请求时,似乎无法下载,因为返回的文件在调用的成功方法中被接受。将此更改为文件的直接链接后,我可以下载。