将大型SQL导出功能处理为较小的进程

时间:2018-07-28 19:16:39

标签: php mysql sql database

我有一个简单的“将某某数据导出到.CSV或.TXT”脚本。它使用一个查询,该查询根据使用它的用户的设置而变化,以选择所有用户的ID,用户名和电子邮件。它可以与大约100-150个用户的数据库配合使用。但是,当有1,000多个用户尝试使用它时,在单击要导出的按钮时会返回“已用完的已分配内存”错误。我了解这是由于尝试通过HTTP请求处理大型查询所致。

我一直在寻找使用MySQL / PHP修复此问题的方法。目前,我正在实现一个设置,让用户选择SQL限制数量,但这将继续为其返回相同数量的成员X,这是我不希望的。

我的查询很简单,如下所示:

SELECT id, username, email FROM Table1 ORDER BY $value ASC

这取自脚本的“导出.CSV”部分:

        $query_data = OW::getDbo()->queryForList($sql2);
        $data1 = $query_data[0];

        function cleanData(&$str)
        {
            if($str == 't') $str = 'TRUE';
            if($str == 'f') $str = 'FALSE';
            if(preg_match("/^0/", $str) || preg_match("/^\+?\d{8,}$/", $str) || preg_match("/^\d{4}.\d{1,2}.\d{1,2}/", $str)) {
            $str = "'$str";
            }
        if(strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"';
        }

        // filename for download
        $filename = "User List ".$langs->text('emaillists', 'website_name')."" . date('Ymd') . ".csv";

        header("Content-Disposition: attachment; filename=\"$filename\"");
        header("Content-Type: text/csv");

        $out = fopen("php://output", 'w');

        $flag = false;
        foreach($query_data as $row) {
        if(!$flag) {
            // display field/column names as first row
            fputcsv($out, array_keys($row), ',', '"');
            $flag = true;
        }
        array_walk($row, 'cleanData');
        fputcsv($out, array_values($row), ',', '"');
        }

        fclose($out);
        exit;

0 个答案:

没有答案