ThinkPHP驗證碼不顯示的解決方案

今天遇到一個很奇怪的BUG,就是我寫了一個PHP程序本地運行正常,可是發佈到甲方的服務器上出現沒法顯示驗證碼的BUG。php

圖片描述

具體表現就是chorme瀏覽器上顯示一個裂了的圖片小圖標,右鍵點擊該圖片在新窗口打開,仍然是一個裂了的小圖片,並不是報錯信息(開啓xdebug擴展和php報錯的狀況下),若是是這樣那麼就說明驗證碼URL路由和業務邏輯代碼沒問題,是生成驗證碼的環節出問題了,個人Debug思路是這樣的:瀏覽器

1.檢查GD庫是否安裝正確,Linux推薦使用yum或者apt或者pecl等方式安裝,Windows推薦使用phpStudy這個集成環境,他集成好了經常使用擴展,只需鼠標右鍵開啓便可。(適用於驗證碼圖片在新窗口打開的時候顯示了報錯信息以及一堆亂碼的狀況下,若是有報錯信息,請根據報錯信息進行debug)
圖片描述服務器

2.檢查驗證碼所調用的字體是否缺失。有部分驗證碼組件調用的字體在目標計算機上並未安裝,這個須要分析驗證碼模塊的源碼觀察。我用的是ThinkPHP官方的think-captcha,在vendortopthinkthink-captchasrc能夠找到他的源碼,在vendortopthinkthink-captchaassets這裏能夠看到這款驗證碼插件是自帶了字體的,因此ThinkPHP的驗證碼基本上能夠不用考慮字體問題,若是是別的驗證碼插件,那麼仍是要檢查一下這個地方的。運維

3.把有bug的驗證碼圖片下載下來,以及本地測試正常的驗證碼圖片下載下來,使用記事本查看而且對比。編輯器

圖片描述

上圖是本地環境的驗證碼圖片的記事本,咱們使用更專業的16進制編輯器來分析一下文件差異。工具

圖片描述

如圖所示,咱們發現bad這個壞文件除了前面多了EF BB BF等數字之外,其餘內容如出一轍,說明是PHP在渲染圖片的時候多渲染了這些文字,至於緣由我猜想多是服務器上沒有專業的代碼編輯器,所以運維人員使用普通的Windows記事本修改了php代碼致使多了這個BOM頭部。性能

若是是第三種緣由,解決方法有兩個,一個是在驗證碼的imagepng輸出圖片代碼調用以前用ob_clean清除php的輸出緩衝區。還有就是使用一些工具批量對代碼的bom進行去除。測試

圖片描述

我這裏使用的是ob_clean,在think-captcha的主文件Captcha.php的第203行以前加上ob_clean(),這樣一勞永逸。若是對性能和穩定性有嚴苛要求,建議仍是用工具批量去除bom比較保險。同時也建議你們隨時在服務器上裝一個editplus等專業的代碼編輯器。不要用Windows的記事本修改代碼。字體

相關文章
相關標籤/搜索