php内存溢出错误怎么解决误

php 执行mysql中查询时内存溢出怎么办?
phpthink框架写的小网站,原来用5万条数据测试时一切正常。数据量加到25万时一直报错内存溢出。请问该怎么改。
如果你的 web 应用,用 PHP 从数据库中 select 出一个 25 万行的结果集,那么你多半是做错了。因为我不觉得在任何情况下,有必要在一个 HTTP 响应中使用这么大的结果集。当然了,在使用到超大的结果集时,PHP 也是可以胜任的,因为 PDO 中有 cursor 的概念,数据可以一行一行取出来,不会一下子占用很多内存。
使用 unbuffered cursor 可以避免内存问题。 cursor 默认使用 buffered 模式。这种模式会把所有结果集返回并载入内存。如果结果集很大的话,内存会爆。unbuffered cursor 是每次只将下一行结果返回,内存占用很小。不过这种模式缺点很多,所以没有作为默认的模式。
你把thinkphp写成phpthink。完了犯这么低级的错误。我要是 ,估计这会儿被气死了
请limit下。。。一次取几十万数据是作死。即使你是做一个简单的,做着玩的网站也要注意下执行时间,数据传输量。看你这controller的命名,是首页?除非是执行些管理页面的需求,否则根本就不应该读这么多数据出来。
作为一个菜鸟 ....怎么说呢
你取出那么多数据 放哪里能都显示呢? 显示出来 谁能看完? 所以要分页啊 骚年
在回答问题之前,先对题主的提问方式提出一点小建议,问这种TroubleShooting相关的问题,除了贴上错误信息外,最好附带贴上你的相关程序代码,没贴代码,大家只能靠假设,正如此时我就假设题主的问题如我以下所言^_^尽管PHP的语言特性使得大多数情况下开发者不需要太关注内存的使用,但是题主的这个问题确实是很多新手容易犯的错误简单来说,在处理数据的过程中,不要一次性读出所有的数据,容易造成不必要的开销以致于内存溢出在大多数情况下,如鲁小夫童鞋所说,在Web开发过程中,大多数情况下,这种遍历大数据的情况都是可以避免的,而如果确实需要取出这么大的结果集,有以下几个可参考的优化方案1、写SQL语句的时候,尽量不使用SELECT * ,而是指定需要的column,这样对数据库和对PHP都有好处,同时能够减少网络IO2、不要一次性从数据库中读出所有数据,例如使用原生PDO时,不要使用$db-&query($sql)-&fetchAll(); 方法,题主使用的ThinkPHP框架中,不要使用ORM模型的select()方法这是多数对PHP或者说对Web开发不熟悉的初学者容易犯的错误,实质上在上面提到的fetchAll()和select()方法内部,都是已经完整,注意是完整的遍历过一遍结果集,将从数据库取出来的所有数据都遍历了一遍整合成二维数组后作为函数返回值返回的,这在很多情况下可以为开发者提供方便的调用,但是在数据量大的时候,即便内存没有溢出,也至少多产生了一次不必要的循环。正确的做法是,原生PDO使用$res = $db-&query($sql)-&fetch()方法,返回的是一个游标,可以通过循环该游标遍历结果集$stmt = $db-&query($sql);
if($stmt){
while($res = $stmt-&fetch()){
//循环中对每行数据进行读取和操作
ThinkPHP框架没怎么用过,但是应该也有提供返回游标的方法,可以参考一下文档大多数时候遍历大数据,都不是为了将这些数据收集到一个数组里,而是为了进行某些统计或者输出(到页面或者到文本),通过游标访问的方式,可以避免将所有结果集都放在一个数组里导致内存溢出这种情况(一种是循环只产生一条数据的内存占用,随后被下次循环的变量覆盖,另一种是25w倍的内存占用,结果可想而知)3、但是某些情况下,又确实需要将所有数据放到一个数组里,但正如开头及鲁小夫所说,对于Web而言,这种大数据量必然不可能一次性展示在页面上,所以通过分页输出即可4、再再某些特殊情况下,又不能分页,又必须一次性读出所有数据放到内存,那就设置ini_set('memory_limit', 0); 吧,但是这种页面不可能出现在Web页面上供用户浏览(即便内存处理的过来,可能程序的时间也会超时导致504,即便程序不超时,产生的页面内容也是巨大的,不可能作为一个前台展示给用户的页面),所以只能是在命令行方式下,跑脚本使用。
游标那个有点搞笑你limit一下会死吗?
已有帐号?
无法登录?
社交帐号登录phpexcel 读取 excel 数据、保存图片 提示内存溢出错误? - 开源中国社区
当前访客身份:游客 [
当前位置:
本帖最后由 scz467 于
17:31 编辑 问题参考:& Fatal error: Allowed memory size of
bytes exhausted (tried to allocate 9216 bytes) inD:\AppServ\ankh\isrc\class\PHPExcel\Reader\Excel5.php&on line1009
我想把 excel 中的数据以及图片都保存下来,图片保存到 mysql 数据库,图片保存到指定目录中& 我现在的程序是 数据量小的时候(图片少的时候)可以操作成功,但是一旦数据量变大(图片变多了) 就会报上面的错了加载 excel 都没有加载成功,
我在网上看了好多帖子 说设置 phpexcel 缓存,我操作了 没成功,本人对 phpexcel 不熟,哪位大神遇见过类似的问题,我这里面的图片都是高清大图 一张图4、5Mb&
我代码在附近里面 哪位大神给指点指点吧&&郁闷两三天了 网上资料也看了不少(execl图片如下图 没有截全)
---------------问题补充---------------
:php.ini 我已经设置了,涉及到全部是没有限制,但是还是报内存溢出啊
共有5个答案
<span class="a_vote_num" id="a_vote_num_
看代码没用的,修改PHP.INI里的内存配置才是王道。
解析EXCEL,是个非常耗内存的事情。
--- 共有 3 条评论 ---
: 这些都设置了
现在我不认为是 php.ini 的问题了 memory_limit 1024M 了
(3年前)&nbsp&
: memory_limit ?这个呢?
(3年前)&nbsp&
php.ini 涉及到的几个选项我都没有限制了上传无限大,执行时间无限大
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
这里面不能上传附近吗?? 本来想把 php.ini 上传的
<span class="a_vote_num" id="a_vote_num_
我没看错吧,1G的内存都用完了啊?你的excel是有多大啊?
看看改改代码吧,读取的时候边读取边回收资源试试。
--- 共有 1 条评论 ---
怎么个边读取边回收资源啊 ,现在是加载都加载不了,excel数据量不大,但是excel中的图片比较多 图片大
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
您访问的页面发生错误!
我们已经将此错误信息记录下来,并将尽快处理,为此造成您的不便请多见谅
<span class="a_vote_num" id="a_vote_num_
如果不怕跑死机就设置ini_set('memory_limit', '-1');
--- 共有 1 条评论 ---
已经解决了,试用excel2007以后的版本就没问题了
(3年前)&nbsp&
更多开发者职位上
有什么技术问题吗?
scz467...的其它问题
类似的话题php长时间任务内存溢出问题
查看完整版本: [--
php长时间任务内存溢出问题
在使用php执行长时间的任务时,会报内存溢出错误。一般有20几万的数据,已经分成每50条去处理,在foreach中也加了unset进行处理,但是还是会报这种错误,一般跑个10几个小时就报错了,php进程内存分配了128M,请问在不分配更大的内存的情况下能样才能尽可能的避免这种问题?
怎么没有人来回答一下呢。。。各位大神支个招啊
使用多进程,逻辑如下:主进程不负责执行任务逻辑,每次到执行任务的时刻,主进程pcntl_fork一个子进程去处理任务,处理完毕就子进程自己就这样能保证主进程不会爆内存,也不会因为业务出错异常退出。
:使用多进程,逻辑如下:主进程不负责执行任务逻辑,每次到执行任务的时刻,主进程pcntl_fork一个子进程去处理任务,处理完毕就子进程自己就这样能保证主进程不会爆内存,也不会因为业务出错异常退出。&#160;( 16:34)&#160;可是子进程也是需要消耗资源的,用多个子进程去分开处理应该是可以的,其实我主要想知道的是php单进程下,变量的回收使用unset是否能够达到效果
理论上unset加足了是可以的你可以用memory_get_usage查看内存使用量&&慢慢调试看是哪个变量在消耗内存代码开发上尽量少用function和对象,使用单例模式对象重用减少new对象
wc组合:可是子进程也是需要消耗资源的,用多个子进程去分开处理应该是可以的,其实我主要想知道的是php单进程下,变量的回收使用unset是否能够达到效果看情况unset 不一定能够回收变量所使用的全部内存:例如 $a = ‘xxx’; $b = $a; unset($a); 其实 $a指向的内存并没有被回收,因为$a的zval结构体被变量$b引用了,只有再unset($b)才能全部回收。我以前遇到过类似的情况是因为每次运行任务去初始化一个数据库链接,但是任务运行完又没有去关闭数据库链接。最后导致数据库链接过多,脚本内存爆了。可以在脚本服务器netstat 或者 lsof -p pid 看下是不是有很多的数据库链接没释放
查看完整版本: [--
Gzip disabled}

我要回帖

更多关于 内存溢出错误怎么解决 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信