如何解决PHP内存溢出问题?-PHP问题

资源魔 29 0

处理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使用问题

抱歉,评论功能暂时关闭!