當腳本停止時,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] => 資源 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 函式。
使用 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 多個圖片,佔用了大量記憶體,所以我需要銷毀它們。