我有一个包含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);
?>
答案 0 :(得分:1)
听起来您正在使用页面加载线程在发送给用户之前编译CSV。这就是它看起来如此缓慢的原因。
如果可能,您可能希望在用户到达该点之前简单地预编译CSV下载。这样他们的浏览器将只接收文件,而不是在生成它时挂起。如果您担心浪费太多时间生成用户永远不会下载的文件,可能会有一个后台作业,在需要时生成文件,但前提是用户已登录(或进入您网站的某个区域)持续X小时。
或者,也许您可以使用jQuery / Ajax显示一个弹出对话框,告诉用户在生成文件时等待,然后在下载完成后消失。
答案 1 :(得分:1)
我会使用MySQL INTO OUTFILE
。它比循环查询结果快得多。您将此添加到您的select语句中,MySQL将负责为您创建文件。
See more documentation on the abilities here.