Cakephp - 导入10k行电子邮件地址

时间:2014-03-27 11:49:57

标签: php cakephp foreach

我有一个脚本,读取大约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!');
        }

1 个答案:

答案 0 :(得分:0)

因为你不知道什么时候超时,所以提示一些。

1)确保每一段代码都有时间,除非你知道在大部分时间内你所拥有的部分是什么。

2)你对每一行的每个数据库进行一次查询,这是一个价值10k的查询...我的心痛。所以,考虑做一个大查询来获取所有电子邮件,并将它们与php进行比较,以了解它们是否是唯一的。再次,时间,也许SQL选项变得更有效(取决于你如何在PHP数组上进行搜索)

3)尝试调整保存的the options。默认情况下,原子选项为true,这可能有点太多而不能保存10k。

$this->Newsletter->saveMany($data, array('atomic'=>false));

如果那些没有解决问题,请尝试划分数组并分阶段保存。我知道这很痛苦,但也许交易太多了。