Home  >  Q&A  >  body text

php为什么运行了一段时间后才报内存溢出?

我一次性从数据库读取了10万条数据,然后循环做一些计算,循环过程中,涉及到的变量都会被下次循环覆盖掉,现在的情况是程序运行了一段时间之后,报内存溢出,为什么不是刚开始的时候就报内存溢出?按照我的理解,我并没有用变量一直去存运算结果,所以如果说内存溢出的话,应该就在一开始就报了啊。

巴扎黑巴扎黑2920 days ago917

reply all(2)I'll reply

  • 女神的闺蜜爱上我

    女神的闺蜜爱上我2016-11-10 15:48:11

    php version 5.5+

    循环中使用yield关键字,迭代中的中间变量可以不占用额外的内存空间

    例:

    for($i = 1; $i <= 10; $i += 1)   
         yield $i;


    reply
    0
  • 面对疾风吧

    面对疾风吧2016-11-10 15:47:35

    在php中其实变量都是通过zval变量来保存,zend_uint refcount__gc 是该变量中的一个计数器,用来保存有多少变量。在变量生成时,其refcount=1,典型的赋值操作如$a = $b会令zval的refcount加1,而unset操作会相应的减1。在PHP5.3之前,使用引用计数的机制来实现GC,如果一个zval的refcount较少到0,那么Zend引擎会认为没有任何变量指向该zval,因此会释放该zval所占的内存空间。但,事情有时并不会那么简单。后面我们会看到,单纯的引用计数机制无法GC掉循环引用的zval,即使指向该zval的变量已经被unset,从而导致了内存泄露。

    你在循环覆盖变量的时候,其实本质的recount值并没有减少,所以所占用内存并没有释放,最后肯定会爆炸。


    reply
    0
  • Cancelreply