|
|
|
|
|
圖片上傳時出現(xiàn)內(nèi)存不足的錯誤
有沒有一種可以防止php GD image library運行時出現(xiàn)內(nèi)存不足的方法?當上傳一張大圖片時,GD就有可能用盡內(nèi)存,終止腳本的運行。我比較喜歡其能拋出一段錯誤描述,但并沒有這樣。
現(xiàn)在我在腳本里首先設置ini_set('memory_limit', '128M'),如果湊效我就這么設置了。但根據(jù)服務器設置這是不可能的,所以我又不得不回到計算法則去估算內(nèi)存的大概使用量,然后與memory_get_usage()做比較(如果這個函數(shù)存在的話),否則只能是粗略估算了。
這樣處理是可以達到目的了,但是處理方式不夠簡潔,并且有時候它也不能成功。我相信會有更好的辦法,例如GD可以返回更好的異常,而不是遇到什么事情只有停止。
◆討論一:
有網(wǎng)友認為操作內(nèi)存不太可能,因為任何動作都會消耗內(nèi)存。其建議最好的辦法是根據(jù)當前內(nèi)存設置來限制上傳圖片的大小。
但我更喜歡讓GD來判斷內(nèi)存的使用量,不能單單顯示上傳文件大小這樣來處理。因為一張經(jīng)過高壓縮、高分辨率的JPG小圖片,使用內(nèi)存比一張經(jīng)過低壓縮、低分辨率的PNG大圖片還要多。這就是為什么我要重新回到內(nèi)存估算的處理方法上來的原因。
◆討論二:
某網(wǎng)友說可以不去計算內(nèi)存消耗,而是設定一個最大內(nèi)存使用值,例如你有4G可以內(nèi)存,那么圖片處理可以設置用2G-4G,一旦超出這個數(shù)值,就停止執(zhí)行腳本,這么避免隱藏的嚴重錯誤。
對于此網(wǎng)友的方法,我認為也是可行的,可是對于共享主機來說,這是無法實現(xiàn)的。我現(xiàn)在只是估算以防止事件掛起。
◆討論三:
捕抓PHP嚴重錯誤,如“Out of memory”或“PHP Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate … bytes) in”。
我認為這個方法不可行。一旦一個PHP腳本出現(xiàn)“Out of memory”,它就不能調(diào)用關閉函數(shù)因為那需要分配更多的內(nèi)存。
◆總結(jié):問題如何解決?到目前為止我還沒有一個更好的解決方案。我希望能有辦法做到在出現(xiàn)“Out of memory”問題時GD拋出異常,但這好像是一個不可能實現(xiàn)的事件。
小知識:GD 是一個開源的圖像處理庫,支持 PNG/JPEG/GIF以及其他格式的圖像。GD一般被用來創(chuàng)建圖表、圖形、縮略圖以及其他圖像相關的處理操作。
參考:PHP生成縮略圖出現(xiàn)內(nèi)存不足的解決方法
用php生成縮略圖,操作300kb+的jpg圖片都沒問題,但是操作220kb左右的png圖片就顯示內(nèi)存用盡,
Allowed memory size of 8388608 bytes exhausted (tried to allocate 3715200 bytes;。。。
出現(xiàn)這個問題的解決方法是把分配給php的內(nèi)存設置大一些,在圖片處理的頁面添加ini_set("memory_limit","12M");
添加之后的內(nèi)存限制僅對本頁面有效,不用擔心對其他程序產(chǎn)生影響。
實例:PHP ini_set 用法
ini_set具有更改php.ini設置的功能。此函數(shù)接收兩個參數(shù):需要調(diào)整的配置變量名,以及變量的新值。
例如,在某腳本出現(xiàn)時增加最大執(zhí)行時間(maximum execution time):
<?php
ini_set('max_execution_time', 600)
// more code
?>
這樣的設置將僅僅影響被設置的腳本。一旦腳本執(zhí)行完畢,該變量將自動恢復到原始值。