我想知道你们中的任何人是否已经尝试了以实时形式(多部分/表格数据)进行CSV迁移的事情我的工作是我讨厌的唯一一件事就是它消耗了大量的时间并且达到了最大值执行超时。我做的快速修复是通过在我的php.ini(或set_time_limit())中设置最大执行时间,但是等待半小时只是导入整个数据虽然它不超过100kb,但我真烦人。我只是反应过度还是什么?
这是代码:
function upload($id, $old_eid)
{
$filename = $_FILES['event_file']['tmp_name'];
$handle = fopen($filename, "r");
while(($data = fgetcsv($handle, 1000, ",")) !== FALSE){
$id = $id;
$id2 = $data[2];
$ckr = $this->Manager_model->check_if_record_exists($id, $id2);
if(count($ckr) > 0):
$this->session->set_flashdata('err', '<div class="error">Duplicated record</div>');
redirect("manager/csver/$id");
else:
$data['col1'] = $data[0];
$data['col2'] = $id;
$data['col3'] = $data[3].' '.$data[4];
$data['col4'] = $data[2];
$data['col5'] = $data[6];
$data['col6'] = $data[1];
$data['col7'] = $data[7];
$data['col8'] = mt_rand(11111, 99999);
$data['col9'] = $old_eid;
$this->Manager_model->add_csv($data);
$this->Manager_model->add_csv_to_photo($data);
endif;
}
fclose($handle);
$this->session->set_flashdata('success', '<div class="success">CSV successfully uploaded</div>');
redirect("manager/records/$id");
//$this->session->set_flashdata('msg', '<div class="success">Records successfully uploaded</div>');
}
我的Manager_model:
function add_csv($data)
{
$src = array(
'col1'=> $data['col1'],
'col2' => $data['col2'],
'col3' => $data['col3'],
'col4' => $data['col4'],
'col5' => $data['col5'],
'col6' => $data['col6'],
'col7' => $data['col7'],
'col8' => $data['col8'],
);
$this->db->insert('e_records2', $src);
if($this->db->affected_rows() == '1'):
return TRUE;
endif;
return FALSE;
}
function add_csv_to_photo($data) {
$src = array(
'col1'=> $data['col1'],
'col2' => $data['col2'],
'col3' => $data['col3'],
'col4' => $data['col4'],
'col5'=> $data['col5'],
'col6'=> $data['col6'],
);
$this->db->insert('e_records', $src);
if($this->db->affected_rows() == '1'):
return TRUE;
endif;
return FALSE;
} function check_if_record_exists($id, $id2)
{
$eid = $id;
$id2 = $id2;
$query = $this->db->query("select * from races_results where eid = $eid AND id2 = $id2");
return $query->result();
}
P.S。 我不是在这里谈论PhpMyAdmin因为我知道import csv文件是如何工作的。而且,使用骨骼迁移文件会产生许多琐碎的任务。
答案 0 :(得分:1)
在我看来,您在CSV文件中每行查询数据库一次(或两次?)的问题。
当然,你会得到可怕的表现
您可以一次完成整个查询,让DB立即为您制作CSV。
SELECT DISTINCT f1,f2,f3,... FROM tablex WHERE .. INTO OUTFILE 'c:/dir/ca.csv'
FIELDS ESCAPED BY '"' FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n';
//note the use of forward slashes even on Windows.
请参阅:http://dev.mysql.com/doc/refman/5.0/en/select-into.html
选择本身的速度是限制因素。
确保您对目录具有写权限,并注意MySQL永远不会覆盖文件
这个命令在MySQL上非常快。
答案 1 :(得分:1)
为什么不运行探查器来优化代码? Codeigniter包含了这个问题,如http://codeigniter.com/user_guide/general/profiling.html
它将为您提供SQL查询的详细信息以及需要很长时间的内容以及在哪里。
$this->output->enable_profiler(TRUE);
答案 2 :(得分:1)
$ id = $ id;
确实
$ ckr = $ this-&gt; Manager_model-&gt; check_if_record_exists($ id,$ id2);
使其更快的一个显而易见的方法是在eid和id2上使用唯一索引并忽略INSERT上的重复行错误。
但实际上,如果你希望它更快,只需要tell mysql to parse and load the data。