我在我的控制器上使用此功能(我使用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个孩子。)
答案 0 :(得分:0)
您可以更改查询,以便获取更少的数据或者必须处理更少的数据吗?如果可以,那么你知道它的超时或内存问题
答案 1 :(得分:0)
你对get_detail_of_parent和get_detail_of_guardian进行的大量调用让我相信你的内存不足。 4 LEFT JOINS不应该大大降低查询速度,除非你没有对表进行适当的索引,或者你正在处理非常大的数据集和没有足够的可用内存。
您是否可以压缩调用以将fname,lname和contact_no检索到单个查询中?看起来您可能正在为每个数据库重新查询数据库,导致您迭代的每个孩子结果有12个查询。