测试php处理100万数据,已经到极限,200万条数据就会崩溃。 浅析THINKPHP的addAll支持的最大数据量

发布于:2020-05-30 22:11:30

<?php

ini_set('memory_limit','3072M');    // 临时设置最大内存占用为3G
set_time_limit(0);   // 设置脚本最大执行时间 为0 永不过期

    //获取开始时的时间
 $time_start = getmicrotime();

function createRange($number){
  
    for($i=0;$i<=$number;$i++){
        $data[]=array();
        $val['time']=time();
        $val['id']=$i;
        yield $val;
    }
}

$result = createRange(1000000); // 这里调用上面我们创建的函数
foreach($result as $ke=>$v){
    echo $v['id'].'<br />';
}




//定义获取时间函数
function getmicrotime(){
        list($usec, $sec) = explode(" ",microtime());
        return ((float)$usec + (float)$sec);
 }




//获取执行代码后的时间
$time_end = getmicrotime();
//计算结果
$time = $time_end - $time_start;
//输出结果
echo "页面执行时间 $time 秒";
    

?>


Thinkphp中的Model操作有两个方法:add()和addAll

 $User = M("User"); // 实例化User对象
 $data['name'] = 'ThinkPHP';
 $data['email'] = 'ThinkPHP@gmail.com';
 $User->add($data);
 $dataList[] = array('name'=>'thinkphp','email'=>'thinkphp@gamil.com');
 $dataList[] = array('name'=>'onethink','email'=>'onethink@gamil.com');
 $User->addAll($dataList);


addAll方法可以做到批量添加数据的功能,也就是MySQL的这种用法:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);


数据量很多情况下尽量选择批量插入而不是循环逐条插入,否则你的数据库会吃不住挂掉。

不过如果你想当然的将所有数据全部存入一个数组并进行addAll也同样会面临挂掉的情况,这是为什么呢?

原因就是mysql中max_allowed_packet变量的配置限制了上传sql语句的长度,在mysql配置中将他配置大一点就行了

max_allowed_packet = 100M


阅读 207+

一片空白

父爱如山,不善表达。回想十多年前,总记得父亲有个宽厚的肩膀,小小的自己跨坐在上面,越过人山人海去看更广阔的天空,那个时候期望自己有一双翅膀,能够像鸟儿一样飞得高,看得远。虽然父亲有时会和自己开玩笑,但在做错事的时候会受到严厉的训斥。父亲有双粗糙的大手掌。