资源上的PHP垃圾收集器?

时间:2011-03-16 12:08:31

标签: php resources garbage-collection

采取这个简单的循环

while(1) {
    $data = file_get_contents('randomfiles.img');
    $resource = imagecreatefromstring($data);

    //> do some image operation and other stuff
    //> continue

    //> not calling imagedestroy($resource);

}

如您所见,我没有调用imagedestroy,但我使用相同的变量($ resource)来存储imagecreatefromstring();的输入(类型资源)

当一个新循环启动时,php GC会自动释放前一个$resource吗?

我们只考虑PHP 5.3 +

由于

2 个答案:

答案 0 :(得分:5)

现在,如果资源是常规PHP对象,那么它将被释放。

但是既然你正在处理GD库对象,那它实际上取决于GD的实现。 GD lib可能会为图像“handle”分配额外的内存,只有在你调用imagedestroy()时它才会释放。 (据我所知,GD Lib实际上是一个用C语言实现的库,带有PHP绑定)。

如果您认为可能忘记致电imagedestroy(),最好围绕$resource创建一个包装类,并在析构函数中调用imagedestroy()

答案 1 :(得分:2)

来自http://de2.php.net/manual/en/language.types.resource.php

  

释放资源

     

由于PHP 4的Zend引擎引入了引用计数系统,因此可以自动检测到没有更多引用的资源,并且它被垃圾收集器释放。因此,很少需要手动释放内存。

     

注意:持久数据库链接是此规则的一个例外。它们不会被垃圾收集器破坏。有关详细信息,请参阅持久连接部分。