知识大全 关于PHP内存溢出问题的解决方法
Posted 知
篇首语:和谐、和谐,我会学习噶!本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 关于PHP内存溢出问题的解决方法相关的知识,希望对你有一定的参考价值。
关于PHP内存溢出问题的解决方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
一.内存溢出解决方案 在做数据统计分析时 经常会遇到大数组 可能会发生内存溢出 这里分享一下我的解决方案 还是用例子来说明这个问题 如下 假定日志中存放的记录数为 条 那么解决方案如下
复制代码 代码如下: ini_set(‘memory_limit M ); //重置php可以使用的内存大小为 M 一般在远程主机上是不能修改php ini文件的 只能通过程序设置 注 在safe_mode(安全模式)下 ini_set失效 set_time_limit( );//设置超时限制为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= ;$j< ;$j++) $v = ($j < ) ? ” ″ $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 ); //每次取出$farr中 个 for($i= $scount=count($_sub);$i<$scount;$i++) $arr = explode($spt $_sub[$i]); $Uarr[] = $arr[ ]; //vurl $Marr[] = $arr[ ]; //vmark $IParr[] = $arr[ ] ” |$nbsp;” $arr[ ]; //IP unset($_sub);//用完及时销毁 unset($farr);这里 不难看出 一方面 我们要增加PHP可用内存大小 另一方面 只要我们想办法对数组进行分批处理 分而治之 将用过的变量及时销毁(unset) 一般是不会出现溢出问题的 另外 为了节省PHP程序内存损耗 我们应当尽可能减少静态变量的使用 在需要数据重用时 可以考虑使用引用(&) 再一点就是 数据库操作完成后 要马上关闭连接 一个对象使用完 要及时调用析构函数(__destruct())
二.unset销毁变量并释放内存问题 PHP的unset()函数用来清除 销毁变量 不用的变量 我们可以用unset()将它销毁 但是某些时候 用unset()却无法达到销毁变 量占用的内存!我们先看一个例子
复制代码 代码如下: <?php $s=str_repeat( ); //产生由 个 组成的字符串 $m=memory_get_usage(); //获取当前占用内存 unset($s); $mm=memory_get_usage(); //unset()后再查看当前占用内存 echo $m $mm; ?>最 后输出unset()之前占用内存减去unset()之后占用内存 如果是正数 那么说明unset($s)已经将$s从内存中销毁(或者 说 unset()之后内存占用减少了) 可是我在PHP 和windows平台下 得到的结果是 这是否可以说明 unset($s)并没有起 到销毁变量$s所占用内存的作用呢?我们再作下面的例子
复制代码 代码如下: <?php $s=str_repeat( ); //产生由 个 组成的字符串 $m=memory_get_usage(); //获取当前占用内存 unset($s); $mm=memory_get_usage(); //unset()后再查看当前占用内存 echo $m $mm; ?>这个例子 和上面的例子几乎相同 唯一的不同是 $s由 个 组成 即比第一个例子多了一个 得到结果是 这是否可以说 明 unset($s)已经将$s所占用的内存销毁了? 通过上面两个例子 我们可以得出以下结论 结论一 unset()函数只能在变量值占用内存空间超过 字节时才会释放内存空间 那么是不是只要变量值超过 使用unset就可以释放内存空间呢?我们再通过一个例子来测试一下
复制代码 代码如下: <?php $s=str_repeat( ); //这和第二个例子完全相同 $p=&$s; $m=memory_get_usage(); unset($s); //销毁$s $mm=memory_get_usage(); echo $p <br /> ; echo $m $mm; ?>刷新页面 我们看到第一行有 个 第二行是 按理说我们已经销毁了$s 而$p只是引用$s的变量 应该是没有内容了 另 外 unset($s)前后内存占用没变化!现在我们再做以下的例子
复制代码 代码如下: <?php $s=str_repeat( ); //这和第二个例子完全相同 $p=&$s; $m=memory_get_usage(); $s=null; //设置$s为null $mm=memory_get_usage(); echo $p <br /> ; echo $m $mm; ?>现在刷新页面 我们看到 输出$p已经是没有内容了 unset()前后内存占用量之差是 即已经清除了变量占用的内存 本例中的$s=null也 可以换成unset() 如下
复制代码 代码如下: <?php $s=str_repeat( ); //这和第二个例子完全相同 $p=&$s; $m=memory_get_usage(); unset($s); //销毁$s unset($p); $mm=memory_get_usage(); echo $p <br /> ; echo $m $mm; ?> cha138/Article/program/PHP/201311/21047相关参考
JVM内存溢出的两大类型及解决方案 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 你知道如何解决
巧解Tomcat中JVM内存溢出问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 你对Tomc
jdk编译器对内存的支持不同client状态和server状态不同后者支持更大些操作系统不同也存在不同位操作系统就比位操作系统大 测试方法在命令行下用javaXmxXXXXMversion命令来
知识大全 java开发中常常遇到的内存溢出问题 OutOfMemory
java开发中常常遇到的内存溢出问题OutOfMemory 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一
探究两大Java内存溢出类型 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 你知道如何解决Jav
再运行php程序时会出现 Allowedmemorysizeofbytesexhausted(triedtoallocatebytes) 出现该错误的原因在确保不是程序产生的原因(例如死循环)
关于解决MyEclipse的耗内存的办法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 老是弹出
Tomcat内存溢出的原因 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Tomcat内存溢出的
JavaMethodStack栈溢出实验什么时候会让JavaMethodStack栈溢出啊?栈的基本特点就是FILO(FirstInLastOut)如果in的太多而out的太少就好overflow
Tomcat运行JavaWeb内存溢出总结 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!