mysql结果到csv写入函数执行没有完成生产

时间:2009-10-13 07:40:24

标签: php codeigniter

我在我的控制器上使用此功能(我使用CodeIgniter)读取数据库,然后生成逗号分隔的字符串,我以print()为基础,以便用户可以保存/打开文件。

在开发方面,大约2000多条记录的出口大约需要20-30秒。问题是,在生产时,请求没有完成/进入空白页面(浏览器没有显示保存/打开对话框)。

我是否需要调整其他一些php.ini设置?目前生产memory_limit为256mb,max_execution_time为300.(开发时max_execution_time为600)。

如果有帮助,这里是代码(剥离版本):

模型(kidsprofile_model):

function get_masterlist() {
    $this->db->select(kid_id,name, date_created, date_modified, birthdate)
    ->from('kids_profile');
}

将上述处理到csv的控制器功能:

function export_to_csv() {
        $kids = $kid_model->get_master_list();
     $out = "";
     $out .= "Date Created,Date Modified,Kid Id,Kid Name,Age".
             "Father Name,Mother Name,Guardian 1 Name,Guardian 2 Name,\n";
 foreach ($kids->result() as $kid) {
  $date_created = ($kid->date_created)?date('F j Y',$kid->kid_date_created):'';
  $date_modified = ($kid->date_modified)?date('F j Y',$kid->date_modified):'';
  $out .= $date_created.",".$date_modified.",".$kid->kid_name.",".getAge($kid->birthdate).","
  .get_detail_of_parent($kid->kid_id,'Mother','lname').",".get_detail_of_parent($kid->kid_id,'Mother','fname').",".get_detail_of_parent($kid->kid_id,'Mother','contact_no').","
     .get_detail_of_parent($kid->kid_id,'Father','lname').",".get_detail_of_parent($kid->kid_id,'Father','fname').",".get_detail_of_parent($kid->kid_id,'Father','contact_no').","
     .get_detail_of_guardian($kid->kid_id,0,'fname').",".get_detail_of_guardian($kid->kid_id,0,'lname').",".get_detail_of_guardian($kid->kid_id,0,'contact_no').","
     .get_detail_of_guardian($kid->kid_id,1,'fname').",".get_detail_of_guardian($kid->kid_id,1,'lname').",".get_detail_of_guardian($kid->kid_id,1,'contact_no').",";
  $out .="\n";
 }

 header("Content-type: text/x-csv");
 header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
 header("Content-Disposition: attachment; filename=master_list.csv");
 header("Pragma: no-cache");
 header("Content-Length: " . strlen($out));
 header("Expires: 0");

 print($out);
}

你在for循环中看到的get_detail_of_guardian()会查询另一个获取孩子监护人信息的表。 (对于那些可能会说为什么不把它与上面的孩子的查询一起加入的人,我尝试了它并且它慢得多,因为我需要4个左连接(2个父母,2个监护人)为1个孩子。)

2 个答案:

答案 0 :(得分:0)

您可以更改查询,以便获取更少的数据或者必须处理更少的数据吗?如果可以,那么你知道它的超时或内存问题

答案 1 :(得分:0)

你对get_detail_of_parent和get_detail_of_guardian进行的大量调用让我相信你的内存不足。 4 LEFT JOINS不应该大大降低查询速度,除非你没有对表进行适当的索引,或者你正在处理非常大的数据集和没有足够的可用内存。

您是否可以压缩调用以将fname,lname和contact_no检索到单个查询中?看起来您可能正在为每个数据库重新查询数据库,导致您迭代的每个孩子结果有12个查询。