我有一个脚本,读取大约10k行的txt文件,每行包含一个电子邮件地址。
对于每个地址,我检查它是否已经被使用,如果是,我将地址放入error
数组,如果不是,我将地址放在save
数组中。
在foreach之后,如果错误数组中没有addreses,我会执行$this->Newsletter->saveMany($data)
。
出于某种原因,当我导入超过500行时,我总是会超时。 有没有办法采用另一种/更好的方法来避免超时?
请指教!
public function import() {
$filename = './files/newsletterImport/newsletter.txt';
$lines = file($filename);
foreach ($lines as $line_num => $line) {
// check unique
if($email = $this->Newsletter->find('first', array('conditions' => array('email' => trim($line))))){
$error[$line_num]['email'] = trim($line);
$error[$line_num]['cancel'] = date('d.m.Y H:i:s', strtotime($email['Newsletter']['cancel']));
}else{
$data[$line_num]['Newsletter']['email'] = trim($line);
$data[$line_num]['Newsletter']['active'] = 1;
}
}
if(!$error){
$this->Newsletter->create();
if($this->Newsletter->saveMany($data)){
$this->set('msg', 'Success');
}else{
$this->set('msg', 'Error! Nothing imported!');
}
}else{
$this->set('msg', 'Error! Nothing imported!');
$this->set('error', $error);
}
}else{
$this->set('msg', 'No file found!');
}
答案 0 :(得分:0)
因为你不知道什么时候超时,所以提示一些。
1)确保每一段代码都有时间,除非你知道在大部分时间内你所拥有的部分是什么。
2)你对每一行的每个数据库进行一次查询,这是一个价值10k的查询...我的心痛。所以,考虑做一个大查询来获取所有电子邮件,并将它们与php进行比较,以了解它们是否是唯一的。再次,时间,也许SQL选项变得更有效(取决于你如何在PHP数组上进行搜索)
3)尝试调整保存的the options。默认情况下,原子选项为true,这可能有点太多而不能保存10k。
$this->Newsletter->saveMany($data, array('atomic'=>false));
如果那些没有解决问题,请尝试划分数组并分阶段保存。我知道这很痛苦,但也许交易太多了。