摘要:腳本與服務(wù)器通信服務(wù)器與腳本通信是通過標(biāo)準(zhǔn)的輸入輸出和環(huán)境變量完成的。應(yīng)用程序執(zhí)行所需要的操作,通常是基于瀏覽者輸入的內(nèi)容。服務(wù)器把結(jié)果返回到瀏覽器中。當(dāng)用戶請(qǐng)求數(shù)量非常多時(shí),會(huì)大量擠占系統(tǒng)的資源如內(nèi)存,時(shí)間等,造成效能低下。
寫點(diǎn)舊東西,最近一直再看 django 源代碼,發(fā)現(xiàn)對(duì)運(yùn)行機(jī)制還是蠻感興趣的(太懶了,這塊一直沒有深入研究過),因?yàn)槌兜搅?wsgi 規(guī)范,就想到了原始的 cgi 接口規(guī)范, 這里就先寫寫我對(duì) cgi 接口規(guī)范 的認(rèn)知,同時(shí)也為了下次組內(nèi)分享預(yù)留個(gè)開頭。
1 遠(yuǎn)古時(shí)代1991年8月6日,這是個(gè)偉大的日子,web 頁面首次在因特網(wǎng)上登場(chǎng),回去早期,web 服務(wù)器主要是用來共享靜態(tài)數(shù)據(jù),只是簡(jiǎn)單的響應(yīng)瀏覽器發(fā)來的 http 請(qǐng)求,并將存儲(chǔ)在服務(wù)器上的靜態(tài)文件返給瀏覽器。所以早期的 web 服務(wù)器的結(jié)構(gòu)如下:
因?yàn)樵缙诘挠脩糁挥懈叽笊系目茖W(xué)家,這樣的架構(gòu)無可厚非,畢竟只是為了共享自己的一些資料,方便交流。
2 CGI 時(shí)代隨著時(shí)間的推移,互聯(lián)網(wǎng)逐漸平民化,技術(shù)在進(jìn)化,網(wǎng)站越來越復(fù)雜,遠(yuǎn)古時(shí)代的架構(gòu)已經(jīng)不能滿足用戶的需求。針對(duì)用戶強(qiáng)烈的動(dòng)態(tài)交互需求,另外一方面,服務(wù)器自己并不能運(yùn)行類似 python 腳本文件,既然服務(wù)器沒法做,只能聯(lián)合第三方一起搞,此時(shí)與第三方通信還是需要有個(gè)約定的,服務(wù)器給第三方參數(shù),第三方返回給服務(wù)器結(jié)果,最后服務(wù)器把結(jié)果返回給客戶端,此后名揚(yáng)江湖的 CGI(Common Gateway Interface) 誕生了。
CGI 定義了 Web服務(wù)器 與外部應(yīng)用程序之間的通信接口標(biāo)準(zhǔn),因此 Web服務(wù)器 可以通過 CGI 執(zhí)行外部程序,讓外部程序根據(jù)Web請(qǐng)求內(nèi)容生成動(dòng)態(tài)的內(nèi)容。Perl 因?yàn)榭绮僮飨到y(tǒng)和易于修改的特性成為 CGI 的主要編寫語言。當(dāng)然,CGI 可以用任何支持標(biāo)準(zhǔn)輸入輸出和環(huán)境變量的語言編寫,比如 Shell 腳本, C/C++ 語言,只要符合接口標(biāo)準(zhǔn)即可。比如你用C 語言編寫 CGI 程序,你把希望返回的 HTML 內(nèi)容通過 printf 輸出就可以發(fā)送給Web服務(wù)器,進(jìn)而返回給用戶。
CGI 腳本與服務(wù)器通信
服務(wù)器與 CGI 腳本通信是通過標(biāo)準(zhǔn)的輸入輸出和環(huán)境變量完成的。
CGI 腳本工作流程
瀏覽器通過HTML表單或超鏈接請(qǐng)求指向一個(gè) CGI 應(yīng)用程序的 URL。
服務(wù)器收發(fā)到請(qǐng)求。
服務(wù)器執(zhí)行所指定的 CGI 應(yīng)用程序。
CGI 應(yīng)用程序執(zhí)行所需要的操作,通常是基于瀏覽者輸入的內(nèi)容。
CGI 應(yīng)用程序把結(jié)果格式化為網(wǎng)絡(luò)服務(wù)器和瀏覽器能夠理解的文檔(通常是 HTML網(wǎng)頁)。
web 服務(wù)器 把結(jié)果返回到瀏覽器中。
CGI 模式性能
CGI 的跨平臺(tái)性能極佳,幾乎可以在任何操作系統(tǒng)上實(shí)現(xiàn)。CGI 方式在遇到連接請(qǐng)求(用戶請(qǐng)求)先要?jiǎng)?chuàng)建 CGI 的子進(jìn)程,激活一個(gè) CGI 進(jìn)程,然后處理請(qǐng)求,處理完后結(jié)束這個(gè)子進(jìn)程。這就是 fork-and-execute 模式。所以用 CGI 方式的服務(wù)器有多少連接請(qǐng)求就會(huì)有多少 CGI 子進(jìn)程,子進(jìn)程反復(fù)加載是 CGI 性能低下的主要原因。當(dāng)用戶請(qǐng)求數(shù)量非常多時(shí),會(huì)大量擠占系統(tǒng)的資源如內(nèi)存,CPU 時(shí)間等,造成效能低下。
web 服務(wù)器: lighttpd,腳本語言: python, 平臺(tái): mac
腳本代碼
#!/usr/bin/env python # -*- coding: UTF-8 -*- import os print "Content-Type: text/plain;charset=utf-8 " print os.environ.get("SERVER_PROTOCOL") print os.environ.get("QUERY_STRING") print "Hello World!"
瀏覽器端
輸入 url 如下:
http://127.0.0.1:8080/cgi-bin/test.py?name=kycool&id=0989238423
返回結(jié)果:
HTTP/1.1 name=kycool&id=0989238423 Hello World!
debug 工具中打開
4 小結(jié)通過例子就會(huì)發(fā)現(xiàn),運(yùn)行模式如下:
例子較為簡(jiǎn)單,復(fù)雜的業(yè)務(wù)如果寫完,估計(jì)自己可以造個(gè)框架輪子了,因?yàn)?CGI 性能低下的原因,python 相關(guān)的 wsgi 出現(xiàn)了......
參考文章
https://www.w3.org/CGI/
https://en.wikipedia.org/wiki/Common_Gateway_Interface
http://www.tianmaying.com/blog/8ab3eda84daf4e54014daf68ff09000b
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/45473.html
摘要:如何擴(kuò)展語法想要擴(kuò)展語法,也就需要深入了解的工作機(jī)制。的工作機(jī)制創(chuàng)建詞法解析器實(shí)例將字符串解析成是官方文檔的叫法,按照我的理解應(yīng)該是節(jié)點(diǎn)接下來創(chuàng)建解析器實(shí)例調(diào)用來解析,生成字符串到這里,的工作機(jī)制就完了。 請(qǐng)移步到我的Blog,獲得更好的閱讀體驗(yàn)!本文的鏈接請(qǐng)點(diǎn)這里 起因 我的博客系統(tǒng)的文章是直接使用gitbook保存的markdown文檔,后端使用marked.js來解析markd...
摘要:布局如下對(duì)于這塊,我不是很理解,后發(fā)現(xiàn),注銷這個(gè)樣式,用可以解決。后查閱一些資料,到了原因。 -12.24-:html布局如下: html css javascript vue css: tab{ width: 600px; margin: 0 auto; } .tab-tit{ width: 600px; font-si...
摘要:三種的區(qū)別即對(duì)應(yīng)中的值,如,服務(wù)器對(duì)任務(wù)都返回同一個(gè),具體的路徑由瀏覽器區(qū)分,因?yàn)闉g覽器不會(huì)發(fā)送后面的值給服務(wù)器。如果是即變成這樣,,所以要對(duì)服務(wù)器配置不同的返回不同的資源。就是沒有的情況,比如。 三種Router的區(qū)別 1. HashRouter: 即對(duì)應(yīng)url中的hash值,如xx.com/#/a、xx.com/#/a/b, 服務(wù)器對(duì)任務(wù)url都返回同一個(gè)url,具體的路徑由瀏覽器...
摘要:簡(jiǎn)介是一種搭建客戶端的應(yīng)用架構(gòu),更像是一種模式而不是一個(gè)框架。 簡(jiǎn)介 Flux是一種搭建WEB客戶端的應(yīng)用架構(gòu),更像是一種模式而不是一個(gè)框架。 特點(diǎn) 單向數(shù)據(jù)流 showImg(https://segmentfault.com/img/remote/1460000018128072?w=1300&h=708); 與MVC的比較 1.傳統(tǒng)的MVC如下所示(是一個(gè)雙向數(shù)...
摘要:基礎(chǔ)簡(jiǎn)單基礎(chǔ)數(shù)據(jù)類型值得注意的是的值是,表示一個(gè)空對(duì)象指針,沒有指向任何對(duì)象。的值是,表示申明變量或?qū)ο蟮膶傩詤s未初始化。值是派生自的,所以對(duì)他們執(zhí)行相等測(cè)試會(huì)返回。字符串單引號(hào)和雙引號(hào)都可以用來表示字符串,只要前后一致即可。 目的 記憶總是會(huì)隨著時(shí)間而淡化,學(xué)習(xí)了點(diǎn)什么,就記錄下點(diǎn)什么。 做點(diǎn)什么,總比不做要好。 基礎(chǔ) 簡(jiǎn)單(基礎(chǔ))數(shù)據(jù)類型 Number ...
閱讀 1141·2021-11-23 10:04
閱讀 2401·2021-11-22 15:29
閱讀 2743·2021-11-19 09:40
閱讀 715·2021-09-22 15:26
閱讀 2117·2019-08-29 16:27
閱讀 2484·2019-08-29 16:10
閱讀 1918·2019-08-29 15:43
閱讀 3275·2019-08-29 12:43