在用tp做驗證碼時,代碼邏輯都正確,但就是加載不出圖片來,如何解決呢?
在創建驗證碼之前加上 ob_clean();
public function haha(){ ob_clean(); $v = new \Think\Verify(); $v->entry(); }
ob_clean()這個函數的作用就是用來丟棄輸出緩沖區中的內容,如果你的網站有許多生成的圖片類文件,那么想要訪問正確,就要經常清除緩沖區。
來具體看一下ob:
ob,輸出緩沖區,是output buffering的簡稱,而不是output cache。ob用對了,是能對速度有一定的幫助,但是盲目的加上ob函數,只會增加CPU額外的負擔。
ob的基本原則:如果ob緩存打開,則echo的數據首先放在ob緩存。如果是header信息,直接放在程序緩存。當頁面執行到最后,會把ob緩存的數據放到程序緩存,然后依次返回給瀏覽器。
ob的基本作用:
1)防止在瀏覽器有輸出之后再使用setcookie()、header()或session_start()等發送頭文件的函數造成的錯誤。其實這樣的用法少用為好,養成良好的代碼習慣。
2)捕捉對一些不可獲取的函數的輸出,比如phpinfo()會輸出一大堆的HTML,但是我們無法用一個變量例如$info=phpinfo();來捕捉,這時候ob就管用了。
3)對輸出的內容進行處理,例如進行gzip壓縮,例如進行簡繁轉換,例如進行一些字符串替換。
4)生成靜態文件,其實就是捕捉整頁的輸出,然后存成文件。經常在生成HTML,或者整頁緩存中使用。
ob系列函數中常用函數集錦
ob_start(); //打開一個輸出緩沖區,所有的輸出信息不再直接發送到瀏覽器,而是保存在輸出緩沖區里面。 ob_clean(); //刪除內部緩沖區的內容,不關閉緩沖區(不輸出)。 ob_end_clean(); //刪除內部緩沖區的內容,關閉緩沖區(不輸出)。 ob_get_clean(); //返回內部緩沖區的內容,關閉緩沖區。相當於執行 ob_get_contents() and ob_end_clean() ob_flush(); //發送內部緩沖區的內容到瀏覽器,刪除緩沖區的內容,不關閉緩沖區。 ob_end_flush(); //發送內部緩沖區的內容到瀏覽器,刪除緩沖區的內容,關閉緩沖區。 ob_get_flush(); //返回內部緩沖區的內容,並關閉緩沖區,再釋放緩沖區的內容。相當於ob_end_flush()並返回緩沖區內容。 flush(); //將ob_flush釋放出來的內容,以及不在PHP緩沖區中的內容,全部輸出至瀏覽器;刷新內部緩沖區的內容,並輸出。 ob_get_contents(); //返回緩沖區的內容,不輸出。 ob_get_length(); //返回內部緩沖區的長度,如果緩沖區未被激活,該函數返回FALSE。 ob_get_level(); //Return the nesting level of the output buffering mechanism. ob_get_status(); //Get status of output buffers. ob_implicit_flush(); //打開或關閉絕對刷新,默認為關閉,打開后ob_implicit_flush(true),所謂絕對刷新,即當有輸出語句(e.g: echo)被執行時,便把輸出直接發送到瀏覽器,而不再需要調用flush()或等到腳本結束時才輸出。 ob_gzhandler //ob_start回調函數,用gzip壓縮緩沖區的內容。 ob_list_handlers //List all output handlers in use output_add_rewrite_var //Add URL rewriter values output_reset_rewrite_vars //Reset URL rewriter values 這些函數的行為受php_ini設置的影響: output_buffering //該值為ON時,將在所有腳本中使用輸出控制;若該值為一個數字,則代表緩沖區的最大字節限制,當緩存內容達到該上限時將會自動向瀏覽器輸出當前的緩沖區里的內容。 output_handler //該選項可將腳本所有的輸出,重定向到一個函數。例如,將 output_handler 設置為 mb_output_handler() 時,字符的編碼將被修改為指定的編碼。設置的任何處理函數,將自動的處理輸出緩沖。 implicit_flush //作用同ob_implicit_flush,默認為Off。
注意事項:
1、ob_* 系列函數是操作PHP本身的輸出緩沖區,所以ob_flush只刷新PHP自身的緩沖區,而flush是刷新apache的緩沖區。所以,正確使用倆者的順序是:先ob_flush,然后flush。ob_flush是把數據從PHP的緩沖中釋放出來,flush是把緩沖內/外的數據全部發送到瀏覽器。
2、不要誤認為用了ob_start()后,腳本的echo/print等輸出就永遠不會顯示在瀏覽器上了。因為PHP腳本運行結束后,會自動刷新緩沖區並輸出內容。