当脚本停止时,PHP 会自动销毁任何
资源,这同样适用于图像,因此在
用户点击停止按钮的情况下,php 会自动
清除资源。
因此,imagedestroy 用于在脚本结束之前清除内存。
这有助于将脚本期间的内存使用量
保持在可接受的水平。
希望这能澄清一些事情。
(PHP 4、PHP 5、PHP 7、PHP 8)
imagedestroy — 销毁图像
注意:
此函数没有效果。在 PHP 8.0.0 之前,此函数用于关闭资源。
在 PHP 8.0.0 之前,imagedestroy() 释放与图像 image
相关的任何内存。
示例 #1 在 PHP 8.0.0 之前使用 imagedestroy()
<?php
// 创建一个 100 x 100 的图像
$im = imagecreatetruecolor(100, 100);
// 修改或保存图像
// 从内存中释放图像
imagedestroy($im);
?>
当脚本停止时,PHP 会自动销毁任何
资源,这同样适用于图像,因此在
用户点击停止按钮的情况下,php 会自动
清除资源。
因此,imagedestroy 用于在脚本结束之前清除内存。
这有助于将脚本期间的内存使用量
保持在可接受的水平。
希望这能澄清一些事情。
重要说明:调用 imagedestroy 时,资源会被释放,但打印的资源输出与调用函数之前相同
<?php
$img = imagecreate(1, 1);
print_r([$img, $img ? 'TRUE': 'FALSE', is_resource($img) ? 'TRUE' : 'FALSE', get_resource_type($img) ?: 'FALSE']);
/*
结果:
Array
(
[0] => Resource id #1
[1] => TRUE
[2] => TRUE
[3] => gd
)
*/
imagedestroy($img);
print_r([$img, $img ? 'TRUE': 'FALSE', is_resource($img) ? 'TRUE' : 'FALSE', get_resource_type($img) ?: 'FALSE']);
/*
结果:
Array
(
[0] => Resource id #1
[1] => TRUE
[2] => FALSE
[3] => Unknown
)
*/
?>
如您在上面的示例中看到的,数组中的第一个索引在两种情况下都为 TRUE。因此,尽管普遍的想法是您不能信任以下代码:
<?php
if ($img) { // 它被强制转换为布尔值,即使在调用 imagedestroy 后也返回 true
// 做一些事情
}
?>
如果您需要确保某个资源可用,则必须使用 is_resource 和 get_resource_type 函数。
使用 imagedestroy() 时应注意,将您的引用变量复制到另一个变量会导致 imagedestroy 同时销毁两者。
例如:
$a = imagecreate(...);
$b = $a;
imagedestroy($a);
虽然您可能认为 $b 仍然包含您的图像,但事实并非如此。$a 和 $b 都被销毁了。
我注意到,如果存在一个先前未经 imagedestroy() 处理的图像,gd 绘图函数可能会出现奇怪的行为。您应该始终在完成对图像对象的处理后使用 imagedestroy。
在处理大量高分辨率图像时,使用 imagedestroy() 函数是**绝对必要的**。
在我的情况下,我将两个高分辨率桌面壁纸缩小成一系列越来越小的壁纸(防止用户不得不上传十几个文件)。
一开始,我的脚本会运行,然后就停止了。后来我意识到,在将文件写入磁盘后,我没有在内存中销毁源图像和新调整大小的图像。因此,我很快便达到了托管服务提供商在他们的 php.ini 文件中设置的内存限制。
重复使用图像变量**不会**清除内存中的旧数据!您必须使用 imagedestroy() 来清除数据。(我不知道 unset() 是否也能起作用)。
还要注意,内存中的图像数据是原始数据,因此不要根据压缩图像(例如 jpeg 或 png)的原始文件大小来判断您的内存使用量。
理论上,创建图像对象并在您的析构函数中调用 imagedestroy 应该是一种不错的方式;类似以下代码
<?php
final class My_Image() {
private $img;
public function __construct() {
$this->img = imagecreatetruecolor();
// ... 其他内容 ...
}
public function __destruct() {
if(is_resource($this->img)) {
imagedestroy($this->img);
}
}
// ... 其他方法...
}
?>
我检查了 $this->img 是否是资源,以防 imagecreatetruecolor() 失败或您在某个方法调用中将该值设为 NULL,这意味着 $this->img **不是** 资源,在这种情况下,imagedestroy 将是一个不必要的函数调用,只会失败并发出警告消息。
为了继续 Docey 的说法,如果 PHP 在脚本停止时没有销毁所有资源,那么就会出现巨大的内存泄漏,每个人都会要求立即修复它。
我在一个脚本中使用此函数,该脚本将由许多小图标组成的图像分割成小部分,这意味着一个脚本中可能包含 400 多张图像,这会占用大量内存,因此我需要销毁它们。