CGI:
CGI(Common Gateway Interface) 是WWW技術(shù)中最重要的技術(shù)之一,有著不可替代的重要地位。CGI是外部應(yīng)用程序(CGI程序)與Web服務(wù)器之間的接口標(biāo)準(zhǔn),是在CGI程序和Web服務(wù)器之間傳遞信息的規(guī)程。CGI規(guī)范允許Web服務(wù)器執(zhí)行外部程序,并將它們的輸出發(fā)送給Web瀏覽器,CGI將Web的一組簡單的靜態(tài)超媒體文檔變成一個完整的新的交互式媒體。
PHP與apache的關(guān)系:
Apache是Web服務(wù)器,負(fù)責(zé)回應(yīng)所有收到的Web請求。比如你訪問http://zhihu.com/1.html,那么Apache就找到根目錄下的1.html文件,將其中的內(nèi)容返回。
如果我需要這個地址能顯示動態(tài)的東西,比如當(dāng)前日期時間,那么就寫一個PHP程序1.php,當(dāng)Apache收到http://zhihu.com/1.php的請求時,通過CGI調(diào)用PHP解釋程序,執(zhí)行1.php文件的內(nèi)容,然后將返回的字符串返回給客戶端。
Web 應(yīng)用、服務(wù)是如何工作的:
apache處理的是最底下的兩層,網(wǎng)絡(luò)通信層和協(xié)議層。
網(wǎng)絡(luò)通信層:包括tcp網(wǎng)絡(luò)通信的若干工作,比如bind, listen, connect, receive, send, disconnect。
協(xié)議層:apache可以處理http協(xié)議中的request和response,并且可以解釋header和body。
mod_python/wsgi/cgi是中間部分。
先說最簡單的cgi。
cgi是通過系統(tǒng)標(biāo)準(zhǔn)的進程調(diào)用的方式調(diào)用上層程序來完成邏輯部分的處理。cgi將apache整理好的request header和request body分別以env和stdin的方式發(fā)給上層程序,然后將上層程序的stdout返回給apache。
后來人們覺得,每一個請求都產(chǎn)生一個進程,這樣做效率太低。所以后來人們發(fā)明了fastcgi。它的原理大概的意思是說fastcgi啟動一個常駐進程。每次當(dāng)apache接到request的時候,通過IPC或者socket將請求內(nèi)容發(fā)給fastcgi進程,然后fastcgi再轉(zhuǎn)發(fā)給上層應(yīng)用。
fastcgi支持C、PHP等多種語言。
后來又有人針對Python語言做了好多優(yōu)化工作,產(chǎn)生了mod_python和wsgi。
Django上最上層的邏輯部分。
cgi => Django:
Python程序被以一個進程的方式被啟動。Django首先要讀取env和stdin,整理成request header和request body,從中找到URI字段,然后根據(jù)url映射關(guān)系找到對應(yīng)的函數(shù)開始執(zhí)行。最后將函數(shù)的返回值以某種固定的格式輸出給stdout。
mod_python/wsgi => Django:
過了mod_python/wsgi之后,就全是Python程序了。request header、request body和response被mod_python/wsgi整理成了Python對象。例如字典、FileIO等。
Django拿到這些對象之后,就可以從request header中找到URI,然后根據(jù)url映射關(guān)系找到對應(yīng)的函數(shù)開始執(zhí)行。之后將函數(shù)的返回值整理成mod_python/wsgi可以接受的response對象(實際上就是一個str或者generator)返回給mod_python/wsgi。