查看完整版本: 有關gd輸出圖片有時候會失效的問題
頁: [1]

sss86523 發表於 2017-1-2 12:12 AM

有關gd輸出圖片有時候會失效的問題

本帖最後由 sss86523 於 2017-1-2 11:53 PM 編輯

各位前輩好,最近使用gd輸出圖片時發現一個問題,當我多次請求.php輸出圖片時,總會有一兩張是失效的,在開發者管理工具觀察時發覺圖片沒有正常輸出,但是當我將此圖片另外開啟新視窗卻又恢復了,具體情況如下。
假設我在一個html裡放了以下tag
<img src="/pad.php?id=1">
<img src="/pad.php?id=2">
<img src="/pad.php?id=3">pad.php裡寫有關gd的code最後加上如下
header ('Content-Type: image/png');

輸出的結果有一張失圖片效(紅框),每次失效的圖都不一樣


當我針對這張圖片按右鍵另外視窗顯示,卻又正常顯示。
於是我去error_log找了一下發現顯示以下錯誤
PHP Warning: imagecreatefromjpeg(): gd-jpeg: JPEG library reports unrecoverable error:....Insufficient memory (case 4)

PHP Warning: imagecreatefromjpeg(): .... is not a valid JPEG file
另開視窗單獨顯示都是OK的,只有一次多張才會發生這個問題,我在代碼中加入以下code還是無法解決
ini_set("gd.jpeg_ignore_warning", true);
ini_set("memory_limit","-1")請教各位有沒有遇過類似的情形!!另外我會利用php輸出圖片,是因為有些案子要使用浮水印,或是當作tiles service時才會使用。




...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

alextang1030 發表於 2017-2-13 01:28 AM

Insufficient memory<---

問題在這吧 記憶體不足
多張時會用比較兇
你試試看把量加多吧

sss86523 發表於 2017-2-18 12:35 AM

本帖最後由 sss86523 於 2017-2-18 12:39 AM 編輯

alextang1030 發表於 2017-2-13 01:28 AM static/image/common/back.gif
Insufficient memory
已經試過了還是無效,但確實是記憶體的問題,我後來改用nginx就可以了,我發現nginx是一張一張圖片載入,不像Apache一次載入很多導致記憶體不足,目前gd會抓一張圖片大約13MB,然後裁切圖片的某一個部分顯示,一次同時會有20次以上的request,造成gd一直去讀取那張13MB的圖片,不知道Apache有沒有可以設定讓圖片一張一張載入的方法,因為我還是想用Apache~...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

cswordli 發表於 2017-2-19 05:33 AM

下列資訊提供你參考:
問題原因 - 重點是php的memory不足,應該跟web server(apache/ngix)無關【証據是error是指php warning】。
解決方法 -
a. 可以改php.ini中的memory_limit設定,直接改成1024M或2048M,改完請務必重開WEB SERVER再使用phpinfo();來觀看是否修改成本。(單一SCRIPT最大可用的MEMORY上限)
b. 直接在本支程式SCRIPT(pad.php)的最上面加入【ini_set("memory_limit","1024M");】程式碼強制本SCRIPT使用的大量記憶體。

~自稱是舊時代兼路過的php coding員~...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>
頁: [1]