Big CSV导出使用PHP阻止用户会话

时间:2014-09-03 13:12:58

标签: php csv export

我正在尝试通过CSV导出导出大量数据。它的数据量非常大,大约有100.000条记录和计数。

我的客户端通常使用两个选项卡同时浏览和检查多个内容。因此,要求是在进行导出时,他可以继续浏览系统。

问题是,当在服务器上生成CSV时,会话被阻止,在生成完成之前无法加载其他页面。

这就是我正在做的事情:

  1. 打开文件
  2. 循环通过数据量(每个周期一个查询,每个周期查询5000条记录)pd:由于某些限制,我无法更改此内容。
  3. 将数据写入文件
  4. 免费记忆
  5. 关闭文件
  6. 设置标题以开始下载
  7. 在整个过程中,无法在另一个标签页中导航该网站。

    代码块:

    $temp       = 1;
    $first      = true;
    $fileName   = 'csv_data_' . date("Y-m-d") . '-' . time() . '.csv';
    $filePath   = CSV_EXPORT_PATH . $fileName;
    
    // create CSV file
    $fp = fopen($filePath, 'a');
    
    // get data
    for ($i = 1; $i <= $temp; $i++) {
    
        // get lines
        $data  = $oPB->getData(ROWS_PER_CYCLE, $i); // ROWS_PER_CYCLE = 5000
    
        // if something is empty, exit
        if (empty($data)) {
            break;
        }
    
        // write the data that will be exported into a file
        fwrite($fp, $export->arrayToCsv($data, '', '', $first));
    
        // count element
        $temp   = ceil($data[0]->foundRows / ROWS_PER_CYCLE); // foundRows is always the same value, doesn't change per query.
        $first  = false; // hide header for next rows
    
        // free memory
        unset($lines);
    }
    
    // close file
    fclose($fp);
    
    /**
     * Begin Download
     */
    $export->csvDownload($filePath); // set headers
    

    一些注意事项:

    1. 计数是在同一个查询中进行的,但它没有进入无限循环,按预期工作。它包含在$ data [0] - &gt; foundRows中,并避免了不必要的查询来计算所有可用记录。
    2. 由于环境设置存在几个内存限制,我无法更改。
    3. 有谁知道如何改善这一点?或任何其他解决方案。

      感谢阅读。

1 个答案:

答案 0 :(得分:0)

我的回答只是因为它对其他人有帮助。一位同事想出了解决这个问题的方法。

之前调用 session_write_close() 功能
$temp       = 1;

执行此操作,您将结束当前会话并存储会话数据,因此我可以在其他选项卡中继续导航该文件。

我希望它有所帮助。

关于此解决方案的一些注意事项:

  1. 在session_write_close()
  2. 之后,您不能要求使用会话数据
  3. 导出脚本位于另一个文件中。例如:home.php通过链接export.php
  4. 调用