当脚本停止时,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']);
/*
结果:
数组
(
[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']);
/*
结果:
数组
(
[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()` 函数失败或你在某个方法调用中将值设为空,这意味着 `$this->img` 不是资源,在这种情况下,`imagedestroy` 将是一个不必要的函数调用,只会导致警告消息。
继续 Docey 的说法,如果 PHP 在脚本停止时没有销毁所有资源,那将是一个巨大的内存泄漏,每个人都会立即要求修复它。
我在一个脚本中使用了这个函数,该脚本将一个由许多小图标组成的图像分解成小部分,这可能意味着在一个脚本中会有 400 多个图像,使用了大量的内存,所以我需要销毁它们。