PHP - 将表数据下载到CSV - 大数据的最快方法

时间:2016-06-24 19:37:04

标签: php csv

我有一个包含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);
    ?>

2 个答案:

答案 0 :(得分:1)

听起来您正在使用页面加载线程在发送给用户之前编译CSV。这就是它看起来如此缓慢的原因。

如果可能,您可能希望在用户到达该点之前简单地预编译CSV下载。这样他们的浏览器将只接收文件,而不是在生成它时挂起。如果您担心浪费太多时间生成用户永远不会下载的文件,可能会有一个后台作业,在需要时生成文件,但前提是用户已登录(或进入您网站的某个区域)持续X小时。

或者,也许您可​​以使用jQuery / Ajax显示一个弹出对话框,告诉用户在生成文件时等待,然后在下载完成后消失。

答案 1 :(得分:1)

我会使用MySQL INTO OUTFILE。它比循环查询结果快得多。您将此添加到您的select语句中,MySQL将负责为您创建文件。 See more documentation on the abilities here.