我有一个大表,500,000条记录,点击一个按钮的数据下载,但它是非常慢的,特别是在一个坏的互联网。
我正在考虑压缩文件,然后保存它,但我确定它会占用额外的内存为整个过程。
是否有更好的方法来优化这个CSV下载
<?php
// mysql database connection details
$host = "localhost";
$username = "admin";
$password = "root";
$dbname = "db_books";
// open connection to mysql database
$connection = mysqli_connect($host, $username, $password, $dbname) or die("Connection Error " . mysqli_error($connection));
// fetch mysql table rows
$sql = "select * from tbl_books";
$result = mysqli_query($connection, $sql) or die("Selection Error " . mysqli_error($connection));
$fp = fopen('books.csv', 'w');
while($row = mysqli_fetch_assoc($result))
{
fputcsv($fp, $row);
}
fclose($fp);
//close the db connection
mysqli_close($connection);
?>
我将使用MySQL INTO OUTFILE
。它比遍历查询结果要快得多。你把它添加到你的select语句中,MySQL就会为你创建文件。
听起来您正在使用页面加载线程在发送给用户之前编译CSV。这就是为什么它看起来那么慢。
如果可能的话,您可能希望在用户下载CSV文件之前对其进行预编译。这样,他们的浏览器将简单地接收文件,而不是在生成文件时挂起。如果您担心浪费太多时间生成用户从不下载的文件,也许可以设置一个后台作业,在需要时生成文件,但只有当用户在最近X小时内登录(或进入您站点的某个区域)时才生成文件。
或者,也许您可以使用jQuery/Ajax来显示一个弹出对话框,告诉用户在生成文件时等待,然后在下载准备好后消失。