中間件是軟件的一般術語,可以將“膠合在一起”單獨,通常很複雜並且已經存在的程序。一些經常與中間件連接的軟件組件包括企業應用程序和Web服務。
參考:
* http://searchsoa.techtarget.com/definition/middleware
* http://www.webopedia.com/TERM/M/middleware.html
* http://www.softwareag.com/blog/reality_check/index.php/integration-insights/middleware-for-my-mom-or-kids-guide-to-what-i-do/
* http://www.networkcomputing.com/netdesign/cdmwdef.htm
* https://en.wikipedia.org/wiki/Middleware
什麼是中間件?
中間件是請求和響應之間存在的代碼,可以採取傳入請求,基於該請求執行操作,並完成響應或將委託書傳遞給隊列中的下一個中間件。
https://github.com/zendframework/zend-smtratigility/blob/master/doc/book/middleware.md
HTTP中間件提供了一種方便的機制,用於過濾HTTP請求輸入您的應用程序。例如,Laravel包括一個驗證應用程序用戶的中間件。如果未對用戶進行身份驗證,則中間件將將用戶重定向到登錄屏幕。但是,如果對用戶進行身份驗證,則中間件將允許請求進一步進入應用程序。
http://laravel.com/docs/master/middleware
Silex允許您運行代碼,該代碼在通過Middlewares處理請求時在不同階段更改默認的Silex行為:
http://silex.sensiolabs.org/doc/middlewares.html
中間件的目的是在調用Slim應用程序之前和/或之後檢查,分析或修改應用程序環境,請求和響應。
http://docs.slimframework.com/middleware/overview/
所有HTTP消息均由正在使用的HTTP協議版本,標題和消息主體組成。請求在消息上構建,以包括用於提出請求的HTTP方法以及提出請求的URI。響應包括HTTP狀態代碼和原因短語。
...
無論您是否是程序員,您都在網絡上到處都看到了它。此刻,您的瀏覽器地址欄顯示了以“ http://”開頭的東西。即使您的第一個Hello World腳本也發送了HTTP標題,而您也沒有意識到它。在本文中,我們將了解HTTP標頭的基礎知識以及如何在Web應用程序中使用它們。
服務器發送給客戶端的HTTP響應包含標題,這些標題可以識別響應主體中的內容類型,發送響應的服務器,在身體中發送了多少個字節,發送響應時等等。 PHP和Apache通常會為您提供護理,將文檔照顧為HTML ,計算HTML,計算HTML的長度。大多數Web應用程序都不需要自己設置標題。但是,如果要發送回HTML的東西,請為頁面設置到期時間,重定向客戶端的瀏覽器或生成特定的HTTP錯誤,則需要使用header()函數。
*How to See HTTP Headers*
* Firebug extensions to analyze HTTP headers.
1. Turn in Firebug
2. Click Net
3. Click Headers
Ref:
* http://docstore.mik.ua/orelly/webprog/php/ch07_05.htm
* http://code.tutsplus.com/tutorials/http-headers-for-dummies--net-8039
*Headers already sent: Why does it happen?*
To understand why headers must be sent before output it's necessary to look at a typical HTTP response. PHP scripts mainly generate HTML content, but also pass a set of HTTP/CGI headers to the webserver:
HTTP/1.1 200 OK
Powered-By: PHP/5.3.7
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
<html><head><title>PHP page output page</title></head>
<body><h1>Content</h1> <p>Some more output follows...</p>
and <a href="/"> <img src=internal-icon-delayed> </a>
The page/output always follows the headers. PHP has to pass the headers to the webserver first. It can only do that once. After the double linebreak it can nevermore amend them.
When PHP receives the first output (print, echo, <html>) it will flush all collected headers. Afterwards it can send all the output it wants. But sending further HTTP headers is impossible then.
PHP沒有對HTTP消息的內置支持。
...
PHP流是發送HTTP請求的最方便和無處不在的方法,但對於正確配置SSL支持,構成了許多限制,並在設置諸如標題之類的內容的情況下提供了一個笨拙的接口。 Curl提供了完整且擴展的功能集,但由於不是默認擴展,通常不存在。 HTTP擴展與捲髮相同的問題,以及傳統上其用法的示例較少的事實。
大多數現代的HTTP客戶庫庫都傾向於抽象實現,以確保它們可以在上述任何層次上執行的任何環境中工作。
筆記:
cURL allows you to connect and communicate to many different types of servers with many different types of protocols.
(http://php.net/manual/en/intro.curl.php)
PHP使用服務器API(SAPI)來解釋傳入的HTTP請求,元帥輸入並將其傳遞給腳本。原始的SAPI設計鏡像了通用網關接口,該接口將元使用數據並將其推入環境變量,然後將其轉移到腳本上。然後,腳本將從環境變量中提取以處理請求並返迴響應。
PHP的SAPI設計摘要摘要通用輸入源,例如Cookie,查詢字符串參數和通過SuperGlobals(分別為$ _COOKIE,$ _GET和$ _POST)的URL編碼的帖子內容,為Web開發人員提供了一層便利性。
...
直接使用超級全局存在許多問題。首先,這些都是可變的,這使得庫和代碼可以更改值,從而改變應用程序的狀態。此外,超級全局使單位和集成測試變得困難且脆弱,從而導致代碼質量降解。
...
最後,當涉及服務器端響應時,PHP以自己的方式獲得:在呼叫()呼叫之前發出的任何內容都會導致該調用變為no-op;根據錯誤報告設置,這通常意味著標題和/或響應狀態未正確發送。解決此問題的一種方法是使用PHP的輸出緩衝功能,但是輸出緩衝區的嵌套可能會變得有問題且難以調試。因此,框架和應用程序傾向於為匯總的標頭和內容創建響應抽象,這些響應可以立即發出 - 這些抽象通常是不兼容的。
Ref: http://www.php-fig.org/psr/psr-7/meta/
您可以使用超級全局變量(如$ _get和$ _post),但它們是全球可變狀態。隨著該單元和代碼的集成測試,很難。
由於這些原因,許多PHP框架決定實施棄權來表示HTTP消息(例如,請參見Symfony HTTPFOUNDATION或ZEND HTTP)。
這導致了任何應用程序基於HTTP消息的特定實現的情況,因此在使用其他框架構建的項目中幾乎不可用。
這就是為什麼一組通用的接口有助於抽象HTTP消息並以框架不可知論的方式與之合作的原因。
Ref: http://stackoverflow.com/questions/32805681/php-why-http-message-implementations
HTTP用於傳輸資源,而不僅僅是文件。資源是可以通過URL識別的一些信息(這是URL中的R)。最常見的資源是一個文件,但是資源也可能是動態生成的查詢結果,CGI腳本的輸出,以幾種語言或其他內容可用的文檔。
參考:
* http://www.w3schools.com/tags/ref_httpmessages.asp
* https://www.jmarshall.com/easy/http/