php 内存溢出

昨天做了个实验,一次插入20万条数据,毫无疑问,这会做成了php的内出溢出,如下

Fatal error: Allowed memory size of 134217728 bytes exhausted 

简单点就是内存中的东西太多了,超过php配置的最高承受,要解决要么就把配置调高,要么就是分批插入,用完的变量从内出中清空。

基本实现思路如下:

for ($k=0;$k<20;$k++){
            $dataList = [];
            for($i=0;$i<10000;$i++){
                $dataList[] = [name => "321" , test => uniqid("tp_",true)];
            }
            dump(M("test") ->addAll($dataList));
            $dataList = null;//每次插入后就清空
            echo M("test")->count();
            echo "完成$k 次 \n";
        }

至于为什么用等于 null 而不是 unset,其实unset只不过是清除引用,并不是清除内存中值,只有当那个值得引用为0时,才会被php垃圾回收机制回收,所以防止值还有其他引用,就选用 = null会比较好,当然,上面例子unset也可以、

但发现还是不可以,把内存打印出来看看

for ($k=0;$k<20;$k++){

            $dataList = [];
            for($i=0;$i<10000;$i++){
                $dataList[] = [name => "321" , test => uniqid("tp_",true)];
            }
            $m=memory_get_usage();//当前内存
//

            dump(M("test") ->addAll($dataList));
//            dump(M("test") ->getLastSql());
            $dataList = null;
            $mm=memory_get_usage();//清空后内存
            echo $m-$mm." ---------->".M("test")->count();


            echo "完成$k 次 \n";
        }
string(6) "182306"
-605856 ---------->191603完成14 次

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 640000 bytes) in E:\workspace\app\ThinkPHP\Library\Think\Db\Driver.class.php on line 198

Call Stack:
    0.0000     227704   1. {main}() E:\workspace\app\index.php:0

-605856 证明内存并没有很好的清除,原因是我这里用了thankphp 3.2 框架,它在内部定义了许多的变量,而这些变量我又不能到其源码中进行 set null,所以只能用原生函数,改如下:

$con = mysql_connect("localhost","root","J_123456");
        mysql_select_db("test", $con);
        for ($k=0;$k<20;$k++){

            $dataList = [];
            $sqlstr = "";
            for($i=0;$i<10000;$i++){
                $dataList[] = "('321',".uniqid("'tp_",true)."')";//[name => "321" , test => uniqid("tp_",true)];
            }
            $sqlstr = implode(",",$dataList);

            $m=memory_get_usage();//当前内存
//
            $sqlstr = "INSERT INTO `test` (`name`,`test`) VALUES ".$sqlstr;
//            dump(M("test") ->addAll($dataList));
            dump(mysql_query($sqlstr));
            dump(mysql_error());
            $dataList = null;
            $sqlstr = null;
            $mm=memory_get_usage();//清空后内存
            echo $m-$mm." ---------->".M("test")->count();


            echo "\n ok $k 's \n";
        }

这次就能快速插入20W 数据了。
关于php 内存,这里记录一下
这里写图片描述

 $a = str_repeat('1',256);//这里尽量大点,主要看正负,毕竟引用也是占用内出的
        $b = &$a;
        $c = &$a;
        $m=memory_get_usage();//当前内存
        unset($a);
        unset($b);
//        unset($c);//unset 必须a,b,c 都同时执行了才回收他们对应的值,才会释放内存
//        $c = null;//无论 a,b,c 随便一个set null了都会回收

        $mm=memory_get_usage();//清空后内存



        echo $m-$mm;

        return;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值