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

set_time_limit(0);//记得改成0ini_set("memory_limit","2000M");header("Content-type:text/ht... 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没有用
展开
 我来答
  • 你的回答被采纳后将获得:
  • 系统奖励15(财富值+成长值)+难题奖励10(财富值+成长值)+提问者悬赏15(财富值+成长值)
百度网友adbe004
推荐于2016-01-02 · TA获得超过172个赞
知道小有建树答主
回答量:123
采纳率:71%
帮助的人:78.8万
展开全部
你看看你的程序里面有没有用到递归,或者有没有死循环。
另外解决此类问题的主要思想就是分而治之

我觉得是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()函数是立马释放内存;
如果可以我帮你看下你的源码;
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
爱可生云数据库
2020-09-24 · MySQL开源数据库领先者
爱可生云数据库
爱可生,金融级开源数据库和数据云服务整体解决方案提供商;优秀的开源数据库技术,企业级数据处理技术整体解决方案提供商;私有云数据库云服务市场整体解决方案提供商。
向TA提问
展开全部

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

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

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

标配了许多有用的工具:

  • Memcheck 是内存错误检测器。

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

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

  • Helgrind 是线程错误检测器。

  • DRD 还是线程错误检测器。

  • Massif 是堆分析器。

  • DHAT 是另一种堆分析器。

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

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

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

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

  • 使用未初始化的内存

  • 读取/写入已释放的内存

  • 读取/写入 malloc 块的末端

  • 内存泄漏

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

  • 双重释放内存

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式