使用codeigniter优化CSV导出

时间:2014-10-13 08:36:17

标签: php codeigniter csv

我最近将我的导出CSV代码从核心php迁移到代码点火器。代码运行良好,但在导出大量数据时速度非常慢..

这是我的旧代码:

function exportCSV($qry,$con,$title)
{
$result = mysql_query($qry, $con) or die(mysql_error($con));

header('Content-Type: text/csv; charset=UTF-8');
header("Cache-Control: no-store, no-cache");  
header("Content-Disposition: attachment;filename=".$title."-".date('mdY').".csv");
//echo "\xEF\xBB\xBF";

$row = mysql_fetch_assoc($result);
 if ($row) {
  echocsv(array_keys($row));
 }
 while ($row) {
  echocsv($row);
  $row = mysql_fetch_assoc($result);
 }
}

function echocsv($fields)
{
    $separator = '';
    foreach ($fields as $field) {
        if (preg_match('/\\r|\\n|,|"/', $field)) {
            $field = '"' . str_replace('"', '""', $field) . '"';
        }
        echo $separator . $field;
        $separator = ',';
    }
    echo "\r\n";
}

这是我的codeigniter代码非常慢...将数据导出为CSV,包含77000行,大约需要15分钟,不包括下载时间..

public function exportCSV()
{
    set_time_limit(0);
    $delimiter = ",";
    $newline = "\r\n";

    $curr_date_time = date("l jS \of F Y h:i:s A");

    $this->products_model->set_venture($this->selected_venture['abbrev']);

    if($get_data = $this->input->get())
    {
        $data = $this->products_model->export_model($get_data);
        $download = $this->dbutil->csv_from_result($data, $delimiter, $newline);
        force_download('export - '.$curr_date_time.'.csv', $download); 
    }
    else
    {
        show_404('page', FALSE);
    }

}

public function export_model($params = NULL)
{
    if ($params != NULL)
    {
        if ($params['name_filter'] != '')
        {
            $this->crawler_db->like('name', $params['name_filter']);
        }

        if ($params['comp_filter'] != '')
        {
            $this->crawler_db->where('fk_competitor_website', $params['comp_filter']);
        }
    }

    return $this->crawler_db->get('pcrawler_'.$this->venture.'.products_final');

}

3 个答案:

答案 0 :(得分:1)

嗨检查数据库util类可以为你工作它真的很简单,生成好的CSV文件这里是代码

$this->load->dbutil();

$query = $this->db->query("SELECT * FROM mytable");

echo $this->dbutil->csv_from_result($query);

请在此处阅读文档Codeigniter CSV export with DB util

答案 1 :(得分:1)

我会调试一下这个函数,看看它实际上很慢。

简单的方法是使用基准测试类来查看它是慢的查询,还是对csv_from_result()的调用。

当你没有将任何参数传递给export_model()时,它仍然很慢吗?如果它只是在运行like或者数据库的位置时速度很慢,那么你可能需要添加一些索引吗?

https://ellislab.com/codeigniter/user-guide/libraries/benchmark.html

一旦找到瓶颈,你可以从那里去

答案 2 :(得分:0)

代码点火器的csv_from_result对我来说真的很慢,我根据自己的需要做了一个不同的...它也可以用于其他CSV导出......

public function array_to_csv($array)
{
   if (count($array) == 0) {
     return null;
   }
   ob_start();
   $df = fopen("php://output", 'w');
   fputcsv($df, array_keys(reset($array)));
   foreach ($array as $row) {
      fputcsv($df, $row);
   }
   fclose($df);
   return ob_get_clean();
}

用法:

$this->array_to_csv($array);