thinkphp3.2 csv批量导入上万条数据时报错超时,请问有什么好的办法处理?

$filename = $_FILES['data']['tmp_name']; 
$handle = fopen($filename, 'r'); 
$result = input_csv($handle); //解析csv 
$length = count($result); 

for ($i = 0; $i < $length; $i++) {
    $ip = $result[$i][0]; 
    $port = $result[$i][1];
    //...
    $data = array(
        "ip" => $ip,
        "port" => $port,
        //...
    );
    $count = $Property->where($where)->find();
    if($count){
        $query = $Property->where($where)->save($data);
    }else{
        $query = $Property->add($data);
    }
}
fclose($result); 
$this->success('导入成功!');
exit();

上传CSV文件,执行后就报错了,求大神支招
ps:必须要判定IP+端口唯一,存在则覆盖,不存在则添加。

图片描述

阅读 5.9k
7 个回答

两种,一种是设置超时时间限制,还有一种就是把它转化成sql最后拿到数据库执行,我推荐第二种,这种性能好

新手上路,请多包涵

你这是单次连接超时了, 设置php超时时间

上传到服务器,服务器跑任务

数据量大,一万条数据就是一万个数组,还是拆分数据的好,在本地拆分,或者在服务器拆分成多个文件分别处理,PHP在处理这种数据时性能不怎么好,或者说目前以我的能力找不到更好的方法,我们在做这种功能时设置的限制1000条数据

数据量这么大,不如分成几部分执行,或者加长你的超时时间设置

1、首先纠正你一个习惯问题,执行脚本不要在浏览器执行,脚本要单独写文件,用php-cli来执行
2、这个问题是php执行超过时间限制的问题,可以修改php.ini 但不建议这样,因为如果上线后在高并发的情况下遇到这种执行时间长的,会造成进程堵塞,所以建议在单独的脚本文件中 ini_set('max_execution_time', '100');设置
3、上万条数据不建议通过一个循环去处理,可以考虑用多进程分片处理,你的代码对sql的IO操作太大,有N条数据,就要对数据库操作2N次,mysql优化中,比较建议用批量更新和批量插入的方式,你可以将需要更新的或者需要插入的push到两个数组,用批量更新或者批量插入的方式来写入,你可以测试下插入100w数据,将数据插入100w次和分片成每次插入1000条,分为1000次插入对比下效率,你会惊叹的。
4、你的代码我没看到有日志记录,没记录当前处理到哪个节点,如果当这个程序执行到一般挂了,重新跑这个程序,就相当于你要重新来过

1.設置超时时间限制
2.使用事務,將數據分批提交。從而減低mysql訪問
3.優化mysql語句,不要使用一個sql語句就插入一條數據 應該 insert into table values (數據1),(數據2)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题