处理PHP内存溢出成绩办法:一、要添加PHP可用内存巨细;二、对数组进行分批解决,将用过的变量实时销毁;三、尽可能缩小动态变量的应用;四、数据库操作实现后,要即刻封闭衔接。
处理PHP内存溢出成绩办法:
一.内存溢出处理计划
正在做数据统计剖析时,常常会遇到年夜数组,可能会发作内存溢出,这里分享一下我的处理计划。仍是用例子来讲明这个成绩,以下:
假设日记中寄存的记载数为500000条,那末处理计划以下:
ini_set(‘memory_limit’,’64M’);
//重置php能够应用的内存巨细为64M,普通正在近程主机上是不克不及修正php.ini文件的,只能经过顺序设置。
注:正在safe_mode
(平安模式)下,ini_set
生效。
set_time_limit(600);//设置超时限度为6分钟 $farr = $Uarr = $Marr = $IParr = $data = $_sub = array(); $spt = ”$@#!$”; $root = ”/Data/webapps/VisitLog”; $path = $dpath = $fpath = NULL; $path = $root.”/”.date(“Y-m”,$timestamp); $dpath = $path.”/”.date(“m-d”,$timestamp); for($j=0;$j<24;$j++){ $v = ($j < 10) ? ”0″.$j : $j; $gpath = $dpath.”/”.$v.”.php”; if(!file_exists($gpath)){ continue; } else { $arr = file($gpath);////将文件读入数组中 array_shift($arr);//移出第一个单位-》<?php exit;?> $farr = array_merge($farr,$arr); unset($arr); } } if(empty($this->farr)){ echo ”<p><center>不相干记载!</center></p>”; exit; } while(!empty($farr)){ $_sub = array_splice($farr, 0, 10000); //每一次掏出$farr中1000个 for($i=0,$scount=count($_sub);$i<$scount;$i++){ $arr = explode($spt,$_sub[$i]); $Uarr[] = $arr[1]; //vurl $Marr[] = $arr[2]; //vmark $IParr[] = $arr[3].” |$nbsp;”.$arr[1]; //IP } unset($_sub);//用完实时销毁 } unset($farr);
这里,没有好看出:
一、一方面,咱们要添加PHP可用内存巨细,另外一方面,只需咱们想方法对数组进行分批解决,分而治之,将用过的变量实时销毁(unset
),普通是没有会呈现溢出成绩的。
二、另外,为了节流PHP顺序内存损耗,咱们该当尽可能缩小动态变量的应用,正在需求数据重历时,能够思考应用援用(&)。
三、再一点就是:数据库操作实现后,要即刻封闭衔接;一个工具应用完,要实时挪用析构函数(__destruct()
)。
二.unset销毁变量并开释内存成绩
PHP的unset()
函数用来肃清、销毁变量,不必的变量,咱们能够用unset()
将它销毁。然而某些时分,用unset()却无奈达到销毁变 量占用的内存!咱们先看一个例子:
<?php $s=str_repeat('1',255); //孕育发生由255个1组成的字符串 $m=memory_get_usage(); //猎取以后占用内存 unset($s); $妹妹=memory_get_usage(); //unset()后再查看以后占用内存 echo $m-$妹妹; ?>
最初输入unset()
以前占用内存减去unset()
之后占用内存,假如是负数,那末阐明unset($s)
曾经将$s从内存中销毁(或许说,unset()之后内存占用缩小了),可是我正在PHP5以及windows平台下,失去的后果是:0。这能否能够阐明,unset($s)
并无起 到销毁变量$s所占用内存的作用呢?咱们再作上面的例子:
<?php $s=str_repeat('1',256); //孕育发生由256个1组成的字符串 $m=memory_get_usage(); //猎取以后占用内存 unset($s); $妹妹=memory_get_usage(); //unset()后再查看以后占用内存 echo $m-$妹妹; ?>
这个例子,以及下面的例子简直相反,惟一的没有同是,$s
由256个1组成,即比第一个例子多了一个1,失去后果是:272。这能否能够说 明,unset($s)
曾经将$s
所占用的内存销毁了?
经过下面例子,咱们能够患上出如下论断:
论断1、unset()
函数只能正在变量值占用内存空间超越256字节时才会开释内存空间。
论断2、只有当指向该变量的一切变量(如援用变量)都被销毁后,才会开释内存。
相干学习保举:PHP编程从入门到通晓
以上就是若何处理PHP内存溢出成绩?的具体内容,更多请存眷资源魔其它相干文章!
标签: php php教程 内存溢出 php故障解决 php使用问题
抱歉,评论功能暂时关闭!