我最近将我的导出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');
}
答案 0 :(得分:1)
嗨检查数据库util类可以为你工作它真的很简单,生成好的CSV文件这里是代码
$this->load->dbutil();
$query = $this->db->query("SELECT * FROM mytable");
echo $this->dbutil->csv_from_result($query);
答案 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);