话说库里有60多W条记录,用php+mysql循环读库,生成xml文件。
现在准备每个xml页面存1000条记录,那就是生成60多页xml文件。现在问题来了:每次生成xml文件到13页的时候 也就是读库里134000条的时候,页面就报错了:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 80 bytes)求大牛 帮忙看下 这是怎么回事? 该怎么处理? 如何让他顺利生成完所有页面
祝好心人一生平安!

解决方案 »

  1.   

    分配的内存不够用了,修改php.ini   找到memory_limit = 128M   改大一点
      

  2.   

    超过php.ini配置文件中memory_limit设置的内存限制了(默认值是128MB,134217728字节)。128兆已经够多了,估计你的代码有问题,循环的时候都是每1000条记录保存到一个变量?可以改为每读取1000条变量保存到一个PHP变量,然后写xml文件,再读取1000条变量,保存到同一个变量,再写xml文件
      

  3.   

    内存超过限制了,可以试着调高php.ini中的内存限制。
    最好还是增加循环读取次数,而且每次循环结束时unset() mysql_free_result()释放不需要的内存
      

  4.   

    每生成一个xml就把之前的数据销毁,把内存空出来处理下一个
      

  5.   


    恩,有道理,可能是返回的数据集占用了太多的内存,可以结合LIMIT循控制,循环查询,每次只返回1000条记录。
      

  6.   

    内存不够了呗,
    方法是:
    1.增大程序可以使用的内存  ini_set('memory_limit', '???M');
    2.减少程序已经使用的内存, 看你的code
      

  7.   

    上面输错了,红色部分是更正过来的:13000条的时候报错。60多W条,改配置文件应该不行了,这得设多大内存啊,呵呵看来只有优化程序了,程序就是循环读库:首先建个mysql连接,然后以1000条记录作为一个循环,生成一页xml文件。然后如此循环下去,每当页面执行到第13页的时候,也就是生成第13个xml页面的时候报内存不够的错了,中间我没有释放mysql链接(因为我觉得不断地释放mysql连接,然后再不断地连接mysql更耗资源),但是每次从库里读取的数据我都保存到同一变量里面了。程序就是这样,望大牛看看我这还能优化么?如何才能让这60多W多记录一次顺利生成完60多页xml文件,感谢涕零,祝好人有好报,一生平安!
      

  8.   

    我没算错的话应该是600多页吧
    用mysql_free_result()释放结果集而不是mysql连接,10页释放一次,还不信了这点数据还搞定不了
      

  9.   

    XML可以分页吗?没听说过
    你是每 1000 条数据写一个文件吧?
    既然是这样,为什么内存占用会累积到第13页?
    前面12页不是已经生成了吗?为什么没有去释放他们所占用的内存?很显然,你的程序并不像你 #9 描述的那样
    另外,你是如何产生 xml 的?不会是 DOMDocument 吧?
      

  10.   

    另外一个可能的情况,你查询数据库返回的结果集中记录的平均长度比较巨大(比如记录平均总长度超过120KB)。可以尝试用mysql_unbuffered_query代替mysql_query。
      

  11.   

    徐哥你说的一点都没错 每1K条写入一个xml文件,写到第13个xml文件报的内存不够错,刚刚我释放了资源,现在可以多写好多xml文件,但写到第50多个xml文件的时候 报错了:
    504 Gateway Time-out--------------------------------------------------------------------------------nginx/0.6.35
    另外要补充的就是:我就是用 DOMDocument 生成的xml,这个有什么异议吗?我只想请教大家 我如何才能顺利生成完所有xml文件 谢谢
      

  12.   


    这个是nginx的连接超时到了...你是用浏览器访问的方式执行的? 不是命令行执行? 
    好吧..那要么调整nginx里的timeout设置,要么就让你的页面能够设定从第几页开始输出。  
      

  13.   

    504 Gateway Time-out 是超时了
    不是 php 超时,而是 nginx超时。因为你在处理期间一直没有echoDOMDocument 非常消耗内存
    对于你的应用不见得合适
    你可贴出 xml 结构看看,可能在 SQL 中可组装完成
      

  14.   

    我每生成一个xml文件都echo了好不好?说明不是echo的原因
    因为我不断在echo 生成多少个文件 就echo了多少句求如何让浏览器顺利执行完 我尽量改程序完成 因为服务器我没权限另外想请教的是:不用浏览器 如何用命令行执行 小弟新手 见笑了 没用过命令行执行php页面 感谢所有好心人
      

  15.   

    关于 504 Gateway Time-out 你可以看看这些 http://www.google.com.hk/search?client=aff-cs-360chromium&ie=UTF-8&q=504+Gateway+Time-out
    没有必要和你争辩既然是 服务器我没权限 ,那么也就无所谓命令行执行了