资源上的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()
我不在乎它们是否立即被释放。重要的是,脚本不能克服内存限制