采取这个简单的循环
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 +
由于
答案 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引擎引入了引用计数系统,因此可以自动检测到没有更多引用的资源,并且它被垃圾收集器释放。因此,很少需要手动释放内存。
注意:持久数据库链接是此规则的一个例外。它们不会被垃圾收集器破坏。有关详细信息,请参阅持久连接部分。