細讀Yii2的Response
細讀Yii2的Response
一個完整的網路請求,最後都需要一個符合協議的返回。Yii2在處理web請求之後,統一通過web/Response處理返回。錯誤也會經過錯誤處理返回一個Response。
一個Response完整的流程有哪些?
創建Response對象,設置Resonse響應格式json,html,xml等
觸發前置事件,暴露操給開發者在輸出前對數據進行調整等
數據格式化。將所有response的內容更加輸出格式轉換成響應的字元串,並確定http返回碼。
設置響應頭。輸出所有自定會返回頭和標註http協議返回頭。
輸出內容。將字元串內容輸出,並刷新緩衝區
觸發後置事件。觸發Response後置操作
數據清理
Yii2的Responsehttp狀態碼明確。在web/Response 文件中定義了狀態碼數組,幾乎涵蓋了所有的http狀態碼,並給出了標註的狀態碼文字說明。如果想了解http狀態碼,看Yii2的Response文件就足夠了。
支持多種方式文件輸出。sendFile 下載文件,sendContentAsFile將內容以文件的方式發送給客戶端,xSendFile文件下載。
發送文件每次最多讀取8M數據,防止佔用過大內存
數據格式,支持多種數據格式html,json,xml並可以指定ResponseFormatter對數據格式進行擴展
Cookie處理,Yii2的請求Cooke由Request處理,但是響應Cookie由Response處理。這個相對於Thinkphp5 以及其他框架而言不一樣。但是這種分工明確的設計卻又很清晰明了。
總的而言,Yii2的Response 代碼邏輯結構相當清晰,而且輸出內容都非常規範的遵循http協議規範。同時提供前置事件,數據準備前置事件,後置事件給開發者在不同的情況下處理額外的數據。代碼在閱讀起來非常明了。從頭到尾,完整的看一遍,就可以完全理解。以下是Response中的兩段代碼。
輸出內容代碼
沒有什麼特殊的。如果是簡單的字元串,直接echo。主要看它處理stream的情況。
首先設置超時時間。對於讀取文件流,沒辦法確定文件讀取需要的時間,因此設置超時時間很必要。
設置最大讀取長度。每個請求都需要佔用一定的內存去處理數據。為了避免我限制申請內存造成php程序報內存不足,因此對於文件讀取程序,必須設置讀取限制。讀取完及時刷新出去。
下載文件請求頭設置
想要輸出一個下載文件的響應,Yii2的輸出請求頭中有以下內容:
非必須
非必須
非必須
必須
必須
必須
必須
設置完請求頭之後就可以把內容輸出。瀏覽器就會彈出一個下載提示框。
TAG:早起敲代碼 |