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 資源

範例

範例 #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] => 資源 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] => 資源 id #1
[1] => TRUE
[2] => FALSE
[3] => 未知
)
*/
?>

如您在上面的範例中所見,陣列中的第一個索引在兩種情況下都是 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() 失敗,或者您在後續的方法呼叫中將其值設為 null,導致 $this->img 不是資源。在這種情況下,imagedestroy 是一個不必要的函式呼叫,只會產生警告訊息而失敗。
1
codefisher.org 的 webmaster
17 年前
繼續 Docey 所說的,如果 PHP 在腳本停止時沒有銷毀所有資源,那將會是一個巨大的記憶體洩漏,大家都會強烈要求立即修復它。

我在一個腳本中使用了這個函式,該腳本將一個由許多小圖示組成的圖片分解成小部分,這意味著一個腳本中可能有 400 多個圖片,佔用了大量記憶體,所以我需要銷毀它們。
To Top