摘要:中圖片的處理都是使用了庫,這個庫提供了很多方法讓可以更方便地對圖片進(jìn)行操作,支持的圖片格式如下回到一開始的問題,那個小伙伴需要處理高分辨的圖片,圖片大小必然很大,所以就會出現(xiàn)內(nèi)存不夠的情況,解決方法還是有很多的。
今天小伙伴在群里問了這么一個問題:
出現(xiàn)這種情況就是因?yàn)閮?nèi)存不足,PHP程序直接退出了,報(bào)錯大概如下:
上圖的意思就是說,我們能使用的內(nèi)存最大是8M,但是處理這個圖片還需要額外的41bytes,就會導(dǎo)致內(nèi)存不足,這是一個很嚴(yán)重的錯誤。在對圖片進(jìn)行操作前需要將圖片的所有信息讀入內(nèi)存中,同時還會使用另一部分內(nèi)存同于處理計(jì)算并緩存輸出,所以內(nèi)存大小的使用還是和圖片的大小有關(guān)。
PHP中圖片的處理都是使用了GD庫,這個庫提供了很多方法讓PHP可以更方便地對圖片進(jìn)行操作,支持的圖片格式如下:
回到一開始的問題,那個小伙伴需要處理高分辨的圖片,圖片大小必然很大,所以就會出現(xiàn)內(nèi)存不夠的情況,解決方法還是有很多的。
1. 設(shè)置圖片最大可上傳的大小前端上傳前可以先檢測下大小,如果超過最大值直接就不請求接口,同時為安全起見,后端接收到請求后也要檢測大小,防止程序異常退出。
2. 壓縮圖片 3. 關(guān)閉memory_limit群里的小伙伴最后使用了一種簡單粗暴的方式解決了該問題,直接在PHP中關(guān)閉memory_limit:
set_time_limit(0); @ini_set("memory_limit","-1");
這樣雖然解決了問題,但不優(yōu)雅也不安全,同樣在php.ini配置文件中將memory_limit的值設(shè)置很大也能解決:
memory_limit = 256M
PHP代碼中也可以這樣設(shè)置:
ini_set("memory_limit", "256M");
上面我們將memory_limit參數(shù)固定了,這就帶來一個弊端,因?yàn)榇蠖鄶?shù)情況下不需要這么大的內(nèi)存,有點(diǎn)浪費(fèi)資源,最好的做法就是根據(jù)需要來設(shè)置memory_limit,我寫了一個如下方法可供參考:
public function setMemoryLimit($filename){ // 控制執(zhí)行時間 set_time_limit(50); $maxMemoryUsage = 256M; $width = 0; $height = 0; $size = ini_get("memory_limit"); // 獲取圖片大小 list($width, $height) = getimagesize($filename); // 計(jì)算需要的內(nèi)存,并轉(zhuǎn)換成"M"單位 // 4 因?yàn)閜ng圖片一個像素有4字節(jié) // 1.5 是一個調(diào)整因子,因?yàn)閙emory_limit不是那么精確 // 詳細(xì)可以查看: http://php.net/imagecreatefromjpeg#76968 $size = $size + floor(($width * $height * 4 * 1.5 + 1048576) / 1048576); if ($size > $maxMemoryUsage){ $size = $maxMemoryUsage; } // 更新 ini_set("memory_limit",$size."M"); }
最后說一下,網(wǎng)上說GD庫是比較耗內(nèi)存的,但我這里沒有做過測試。Github上有個C的項(xiàng)目叫libvips/libvips:
可以在不占用很多內(nèi)存的情況下提高圖片處理的速度,這是地址:https://github.com/libvips/li...,有時間可以學(xué)習(xí)下。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/31003.html
小編寫這篇文章的主要目的,主要是給大家介紹關(guān)于Python的一些事宜,比如會涉及到圖像處理相關(guān)的問題,比如會涉及到相關(guān)的圖像的形變與縮放,那么,遇到這種問題的話,具體要怎么操作呢?下面就給大家詳細(xì)解答下?! kimage的transform模塊 圖形的放大與縮小,應(yīng)用到的技術(shù)是skimage的transform模塊,函數(shù)比較多,功能齊全。 1、改變圖片尺寸resize 函數(shù)格式為: ...
摘要:又拍云圖片處理集群規(guī)模及架構(gòu)圖片處理集群規(guī)模臺核內(nèi)存的服務(wù)器,相當(dāng)于有核的處理能力。平時花瓣網(wǎng)的圖片處理量就已經(jīng)占集群超過,一下子翻幾十倍的處理量進(jìn)來,肯定會對作圖服務(wù)造成影響。 黃慧攀,又拍云 CTO。最早在 2001 年開始 web 開發(fā)工作;2006 年創(chuàng)辦 yo2.cn 優(yōu)博網(wǎng)(WordPress 博客平臺);2010 年加入又拍云開始構(gòu)建第一代云存儲和云 CDN 服務(wù)。曾從事前端、...
摘要:場景圖片上傳,是網(wǎng)站開發(fā)常見的需求用戶上傳圖片后端處理圖片壓縮生成縮略圖裁剪加水印等等保存在特定的文件夾中,在這個過程中,有時候上傳大圖片會出現(xiàn)錯誤,就是內(nèi)存溢出的意思。 [場景] ? ? 圖片上傳,是網(wǎng)站開發(fā)常見的需求——用戶上傳圖片=>后端處理圖片(壓縮、生成縮略圖、裁剪、加水印等等...)=>保存在特定的文件夾中,在這個過程中,有時候上傳大圖片會出現(xiàn)錯誤Allowed memor...
閱讀 2074·2021-09-22 15:43
閱讀 8748·2021-09-22 15:07
閱讀 1088·2021-09-03 10:28
閱讀 2064·2021-08-19 10:57
閱讀 1077·2020-01-08 12:18
閱讀 2983·2019-08-29 15:09
閱讀 1535·2019-08-29 14:05
閱讀 1647·2019-08-29 13:57