资源上的PHP垃圾收集器?

资源上的PHP垃圾收集器?,php,resources,garbage-collection,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); } 如您所见,我没

以这个简单的循环为例

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 +< /P>


谢谢,如果资源是一个普通的PHP对象,它就会被释放

但由于您处理的是GD库对象,因此它实际上取决于GD的实现。GD lib可能正在为该映像“句柄”分配额外内存,只有在调用
imagedestroy()
时才会释放该句柄。(我知道GD-Lib实际上是一个用C实现的库,带有PHP绑定)

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

释放资源 多亏了PHP4的Zend引擎引入的引用计数系统,一个没有更多引用的资源会被自动检测到,并被垃圾收集器释放。因此,很少需要手动释放内存

注意:持久数据库链接是此规则的例外。它们不会被垃圾收集器销毁。有关更多信息,请参阅持久连接部分


(reference)@yes注意,当ref计数降至零时,垃圾收集器不会立即启动。如果要确保资源已销毁,最安全的方法仍然是使用
imagedestroy()
我不在乎它们是否立即被释放。重要的是,脚本不能克服内存限制