PHP Conference Japan 2024

imagedestroy

(PHP 4, PHP 5, PHP 7, PHP 8)

imagedestroy销毁图像

描述

imagedestroy(GdImage $image): bool

注意:

此函数没有任何作用。在 PHP 8.0.0 之前,此函数用于关闭资源。

在 PHP 8.0.0 之前,imagedestroy() 释放与图像 image 相关联的任何内存。

参数

image

一个 GdImage 对象,由其中一个图像创建函数返回,例如 imagecreatetruecolor()

返回值

成功时返回 true,失败时返回 false

变更日志

版本 描述
8.0.0 此函数现在是 NOP
8.0.0 image 现在期望一个 GdImage 实例;之前,期望一个有效的 gd resource

示例

示例 #1 在 PHP 8.0.0 之前使用 imagedestroy()

<?php
// 创建一个 100 x 100 的图像
$im = imagecreatetruecolor(100, 100);

// 更改或保存图像

// 从内存中释放图像
imagedestroy($im);
?>

添加注释

用户贡献的注释 7 条注释

55
Docey
18 年前
当脚本停止时,PHP 将自动销毁任何
资源,这同样适用于图像,因此在
用户点击停止按钮的情况下,php 将自动
清除资源。

因此,imagedestroy 用于在
脚本结束之前清除内存。这对于保持内存使用量
在脚本期间达到可接受的水平很有用。

希望这能澄清一些事情。
7
devel at kijote dot com dot ar
4 年前
重要说明:调用 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 函数。
18
Claude D.
9 年前
使用 imagedestroy(); 时应注意,将引用变量复制到另一个变量会导致 imagedestroy 同时销毁两者。

例如

$a = imagecreate(...);
$b = $a;
imagedestroy($a);

虽然您可能认为 $b 仍然包含您的图像,但事实并非如此。$a 和 $b 都被销毁了。
6
dan at mlodecki dot net
20 年前
我注意到,如果存在先前未 imagedestroy() 的图像,则 gd 绘制函数可能会表现异常。在完成图像对象后,应始终使用 imagedestroy。
7
Andrew Hoffmann - ahoffmann at wisc dot edu
19 年前
在处理大量高分辨率图像时,使用 imagedestroy() 函数是**必须**的。

在我的场景中,我正在获取两个高分辨率桌面壁纸并将它们缩小为越来越小的壁纸(防止用户不得不上传十几张文件)。

最初,我的脚本会运行,然后停止。我后来意识到,在将文件写入磁盘后,我没有从内存中销毁源图像和新调整大小的图像。因此,我很快达到了我的托管服务提供商在其 php.ini 文件中设置的内存限制。

重用图像变量不会清除内存中的旧数据!您必须使用 imagedestroy() 来清除数据。(我不知道 unset() 是否也能工作)。

另请注意,内存中的图像数据是原始的,因此不要根据压缩图像(如 jpeg 或 png)的原始文件大小来确定您使用了多少内存。
4
corpus-deus at softhome dot net
14 年前
理论上,创建图像对象并在析构函数中调用 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` 将是一个不必要的函数调用,只会导致警告消息。
1
codefisher dot org 网站管理员
17 年前
继续 Docey 的说法,如果 PHP 在脚本停止时没有销毁所有资源,那将是一个巨大的内存泄漏,每个人都会立即要求修复它。

我在一个脚本中使用了这个函数,该脚本将一个由许多小图标组成的图像分解成小部分,这可能意味着在一个脚本中会有 400 多个图像,使用了大量的内存,所以我需要销毁它们。
To Top