php内存溢出问题,求教大神!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php内存溢出问题,求教大神!相关的知识,希望对你有一定的参考价值。

set_time_limit(0);//记得改成0
ini_set("memory_limit","2000M");
header("Content-type: text/html; charset=UTF-8");

$dir = '../../../files';//都是xml文件

$files = file_list($dir);//列出files文件夹下所有文件

foreach ($files as $file)

$doc = simplexml_load_file($file);

foreach ($doc->authority as $a)//有很多个foreach,这边只列出一个

$t['authority']=$a;
$t=preg_replace('/\'/','\\\'',$t);
$sql="INSERT INTO table VALUES ('','".$t['authority']."');";
if(mysql_query($sql,$con))else$error++;

unset($t);

……



代码大概就这样。
一共有15万+个xml文件,
我执行了一下这个php,大概跑了3000个就溢出了。
memory limit已经设置过了,4000m也试过了没有用。

后来试了一下用 t.php?file_id=1000 这种用$_get跑一千个刷新一下,但是还是没有用。
echo "<script>location.href='t.php?file_id=$file_id';</script>";

请问各位大神,有啥解决内存溢出的方法?memory limit和unset没有用

参考技术A 你看看你的程序里面有没有用到递归,或者有没有死循环。
另外解决此类问题的主要思想就是分而治之

我觉得是foreach的机制的问题
foreach($arr as $key=>$value)这里面的$value是每次循环是把数组中元素的值赋值给$value
而foreach($arr as $key=>&$value)这里的$value是引用赋值。
两者有什么区别呢?带引用的$value可以$value='aaa';直接改变元素的值;还有一个重要的,就是最后一次循环之后$value的值还会保留;
你这里是foreach($obj as $value)对象默认是引用传值;所以循环过后要unset($obj);

php里还有一个函数clearstatcache(true)清楚文件状态缓存,虽然受影响的函数没有simplexml_load_file(),不过还是可以试试;

还有mysql系列的函数很多也不是很稳定,有时候不知道会出什么问题;建议用PDO;

深感php里面的坑太多了,稍不注意就跳进去了。追问

用 t.php?file_id=1000 这种用$_get跑一千个刷新一下
echo "location.href='t.php?file_id=$file_id';";

为什么这样也没有用?不是页面刷新了一下嘛?页面刷新不会重置memory嘛?

追答

页面刷新php脚本所占用的内存肯定会释放,你可以试着改进以下.用header('refresh:3;url=t.php?file_id='.$file_id
);减轻服务器的压力;另外可以把每次的次数改小;
如果这样不可以;肯定是程序本身的问题;
其实我总觉得你那个是本身的程序的问题;unset()函数是立马释放内存;
如果可以我帮你看下你的源码;

本回答被提问者和网友采纳
参考技术B

内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

内存泄漏缺陷具有隐蔽性、积累性的特征,比其他内存非法访问错误更难检测。因为内存泄漏的产生原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。此外,内存泄漏通常不会直接产生可观察的错误症状,而是逐渐积累,降低系统整体性能,极端的情况下可能使系统崩溃。

Valgrind 是一个用于构建动态分析工具的工具框架。它提供了一组工具,每个工具都执行某种调试、分析或类似的任务,以帮助您改进程序。Valgrind 的体系结构是模块化的,因此可以轻松地创建新工具,而不会影响现有的结构。

标配了许多有用的工具:

    Memcheck 是内存错误检测器。

    Cachegrind 是一个缓存和分支预测探查器。

    Callgrind 是一个生成调用图的缓存分析器。

    Helgrind 是线程错误检测器。

    DRD 还是线程错误检测器。

    Massif 是堆分析器。

    DHAT 是另一种堆分析器。

    SGcheck 是一种实验性工具,可以检测堆栈和全局阵列的溢出。

    BBV 是一个实验性 SimPoint 基本块矢量生成器。

    关于内存泄漏,我们需要使用 valgrind 的默认工具,也就是 memcheck 工具。

    Memcheck 是内存错误检测器。它可以检测以下和内存相关的问题:

    使用未初始化的内存

    读取/写入已释放的内存

    读取/写入 malloc 块的末端

    内存泄漏

    对 malloc/new/new[]与free/delete/delete[] 的不匹配使用

    双重释放内存

求教大神,在matlab里怎么建立一个基于高斯近似的模型?

参考技术A randn可以产生均值为0方差为1 的标准正太分布模型。

以上是关于php内存溢出问题,求教大神!的主要内容,如果未能解决你的问题,请参考以下文章

一次php内存溢出的解决及思考

PHP 内存溢出

PHP 内存溢出

php 执行mysql中查询时内存溢出怎么办

求教大神,update tb set a=a*10报错将 numeric 转换为数据类型 numeric 时出现算术溢出错误

记因PHP的内存溢出导致的事故之解决