web開發中的php應用地位發展史



一個學期前我也和樓主差不多不知道這些都是啥,一個學期之後差不多都弄懂了,來講講自己的理解吧 > < 因爲接觸的時間不是很長,有錯誤的地方歡迎指正~

首先要知道網站訪問大概是什麼個過程:
假設你在瀏覽器地址欄輸入這個問題的地址

http://www.zhihu.com/question/22689579

訪問過程和下圖差不多,瀏覽器和服務器交流,服務器和數據庫交流(有時候數據庫就在服務器那臺機子上)

&amp;lt;img data-rawheight="591" data-rawwidth="842" src="https://pic4.zhimg.com/528560fb56581ae59a16e48309835003_b.jpg" class="origin_image zh-lightbox-thumb" width="842" data-original="https://pic4.zhimg.com/528560fb56581ae59a16e48309835003_r.jpg"&amp;gt;
HTML 與 CSS
你家電腦拿到一個 html (就是上圖 HTTP 響應的 body 裏的內容)之後,就會對它進行解析渲染。HTML 就是一種標記語言。類比一下,大家在論壇上經常會用一些代碼來添加富文本內容,舉一些栗子:

  • [img]圖片地址[/img]

    用來貼圖

  • [url]超鏈接[/url]

    用來貼地址

  • [del]呵呵[/del]

    表示標籤裏的文字應該被刪掉(默認添加刪除線效果)

這種論壇代碼也是一種標記語言,HTML 的作用就和它差不多。服務器返回給你的html文件裏面,寫的是一些代碼,大概是這樣的:
&amp;lt;img data-rawheight="384" data-rawwidth="511" src="https://pic3.zhimg.com/009681382de97041f5fd88f15af96af6_b.jpg" class="origin_image zh-lightbox-thumb" width="511" data-original="https://pic3.zhimg.com/009681382de97041f5fd88f15af96af6_r.jpg"&amp;gt;瀏覽器拿到這些代碼之後,分析一下給你渲染好頁面顯示出來,如果不用css,效果是這樣的,按照瀏覽器默認的樣式顯示出列表、圖片、超鏈接、輸入框、按鈕等等:
&amp;lt;img data-rawheight="362" data-rawwidth="330" src="https://pic2.zhimg.com/8df8c13d0201f95d376713316ba8b4c5_b.jpg" class="content_image" width="330"&amp;gt;
是不是覺得默認樣式有點看瞎狗眼呢……所以很多時候我們需要自定義樣式,現行通用的規定樣式的語言是CSS,我們可以用它寫一些定義樣式的代碼,然後在 html 文件裏用一個<link>標籤把這些規定樣式的 CSS 代碼與表達內容語義的 HTML 代碼關聯起來,然後你就能看到一個符合人類正常審美的頁面了:
&amp;lt;img data-rawheight="296" data-rawwidth="662" src="https://pic1.zhimg.com/09c5f8383fa0a5a33379971809fc7cc4_b.jpg" class="origin_image zh-lightbox-thumb" width="662" data-original="https://pic1.zhimg.com/09c5f8383fa0a5a33379971809fc7cc4_r.jpg"&amp;gt;
CSS 代碼的格式基本是

屬性:值

比如知乎頂上那個藍色的導航條,它的 CSS 大約是這樣的
&amp;lt;img data-rawheight="256" data-rawwidth="408" src="https://pic2.zhimg.com/3f351f51a9043d6166985ff2be4742b1_b.jpg" class="content_image" width="408"&amp;gt;
第一個屬性對應的代碼翻譯成人話,就是它的位置(position)應該是不動(fixed)的,瀏覽器會兢兢業業地去實現這段代碼要求實現的效果, 所以你在頁面上翻來翻去頂上那個導航條都會死死地黏在窗口頂部不跟着滾動。
再拿裏面的其他幾個屬性做栗子解釋一下就是:

  • left 和 top 爲零指明這個導航條要緊貼着窗口的左上角

  • width 和 height 指定這個導航條的寬和高

  • background 指明這個導航條的背景是一種漸變的藍色

瀏覽器就會根據這些 CSS 代碼,“畫”出對應的樣式。

HTML 5 與 XHTML
像人的語言一樣,網絡上的網頁裏的 HTML 代碼也不一定是標準的,好比有時候你發音不太標準,別人會去猜測你說的到底是什麼一樣,有些時候前端程序猿不小心寫錯了 HTML,瀏覽器也會試圖猜測他們原來想寫的是什麼,做對應的渲染,而猜是要有一個常識做依據的。加上有些瀏覽器支持一些標籤,有一些又不支持,以及其他混亂的情況,爲了防止大家雞同鴨講,我們需要對 HTML 代碼裏能有什麼標籤,標籤怎麼寫,標籤可以有什麼屬性這些東西有一定的共識,建立一個通行的標準,HTML5 就是其中一個比較新的標準。這個標準新加了很多可以用的標籤和屬性,然後各大瀏覽器也吭哧吭哧按這個標準去實現了很多這些新加的標籤和屬性,本來前端程序員要寫一堆代碼去實現的效果,現在瀏覽器都給你實現好了,只要寫兩三行,調用一下瀏覽器給你實現的部分就能搞定,簡單愉快,所以很多人都在熱情地推廣這個標準~(當然新標準也不可能是完美的,總會有一些問題,怕跑題這裏按下不表~)

至於 XHTML,就是 HTML 的近親 XML 和 HTML 自己的雜交品種,對語法要求比較嚴格,並且爲了兼容 XML,在語法上與 HTML 有一些不同~

JavaScript 與瀏覽器腳本
有了表示內容和語義的 HTML,規定樣式的 CSS,得到的是一個靜態的頁面,沒什麼動畫(其實用 CSS 還是可以有一些動畫的,不過這個跑題了),按 F5 纔會刷新數據,都 21世紀了,這麼呆板單調的網頁怎麼能展現我大智人種族的創造性口胡!於是我們有了 Javascript(JS) 來給頁面添加一些動態的效果,比如知乎問題的標籤,鼠標移上去會彈出一個小窗口,這個就是 JS 實現的效果啦。

&amp;lt;img data-rawheight="274" data-rawwidth="532" src="https://pic4.zhimg.com/dcb4e911b7ee1e74346a821f03363213_b.jpg" class="origin_image zh-lightbox-thumb" width="532" data-original="https://pic4.zhimg.com/dcb4e911b7ee1e74346a821f03363213_r.jpg"&amp;gt;
瀏覽器都會幫你實現一些 JS 可以用的工具(函數,對象什麼的),你只要寫一些 JS 的代碼,保存在 xxx.js 裏,在 html 文件中用 <script> 關聯進來就可以用了,像上圖這個效果應該就包括了

  1. 鼠標懸停到標籤上時創建一個新的 <div> 小窗口

  2. 用 JS 向知乎服務器發送一個請求,得到這個小窗口應該顯示的數據,放在這個小窗口裏(這就是所謂的AJAX,不用刷新就能與服務器進行交互,更新頁面的一小部分~)

瀏覽器拿到這樣的代碼,就會解析並實現出相應的效果,樓主問的瀏覽器腳本,指的就是這樣子的代碼。其實用來寫瀏覽器腳本的,也不是非得JavaScript 不可,當年還爲到底用什麼語言寫這種代碼有過一段戰火紛飛的時期,但現在塵埃落定,各大瀏覽器都默認了:請用 JS 寫這些動態效果的代碼給我解析~

以上就是前端部分的內容,下面簡述一下後端的東西吧> <

Web Server 和 Web Services
瀏覽器給服務器發一個請求,服務器不是一看就知道怎麼響應的。首先這些請求和響應要有一個通用的寫法,也就是要有一個協議,常用的是 HTTP 協議。
像最前面的圖,服務器的響應寫了一個狀態碼 200 OK ,是 HTTP 協議里約定俗成的一個東西,服務器寫 200 OK 在響應裏,表示“你請求的這個東西我有”,如果是404 Not Found,就是“你請求的這個東西我這裏沒有”。
HTTP 響應裏還包括很多東西,比如 Content-type 表示服務器發過來的文件類型是什麼(文本?動畫?圖片?音頻?),這樣發過去了人家瀏覽器好知道怎麼展示給用戶看。人家服務器怎麼知道按協議要寫什麼東西進去呢,這就是 Web Server 幹活的時候了。

形象化一下HTTP響應,大概就長這樣:

&amp;lt;img data-rawheight="351" data-rawwidth="284" src="https://pic1.zhimg.com/73fc01d295c7e015c11826ef29776d80_b.jpg" class="content_image" width="284"&amp;gt;
再上個錘子,瀏覽器和服務器之間請求響應的過程大致是長這樣的,右下角的那些東西就是由 Web Server 生成的(服務器腳本可以做一些改動,但這些一般是 Web Server 的份內活):
&amp;lt;img data-rawheight="349" data-rawwidth="1364" src="https://pic2.zhimg.com/2fdad81d11618addf1300d18a86bdf65_b.jpg" class="origin_image zh-lightbox-thumb" width="1364" data-original="https://pic2.zhimg.com/2fdad81d11618addf1300d18a86bdf65_r.jpg"&amp;gt;


再比如說很多時候你訪問一個網站,瀏覽器裏輸的地址並沒有寫明你請求的文件,比如這個問題的地址是:

http://www.zhihu.com/question/22689579

但知乎的服務器其實返回了一個html給你,服務器怎麼知道這個地址對應要返回什麼樣的 html 代碼給你的?也是 Web Server 乾的活。

除了瀏覽器輸地址敲回車這種赤裸裸的訪問,客戶端與服務器的交互還有很多種,比如:

  • 前面提到的用 JS 完成的 AJAX,有點像瀏覽器和服務器之間的悄悄話~

還有其他應用軟件與服務器的交互,比如:

  • 微信、QQ 與騰訊的服務器的交互

  • 網遊客戶端與網遊公司服務器的交互

  • 搜索引擎用來蒐集網頁信息的程序(爬蟲)與各種各樣的網站服務器的交互

  • 只要你知道用什麼地址訪問、怎樣訪問人家的服務器,並且有相應權限,你也可以自己寫一些程序去和他們的服務器交互(比如用微博API - 新浪微博API獲取微博,開發第三方應用或者做數據分析)。

從這些栗子裏可以看出,客戶端與服務器的交互的主體、客體、載體是五花八門的:

  • 服務器可以是大型機也可以是個人電腦,只要能跑相應的程序就行

  • 客戶端像前面舉的栗子裏一樣,可以是各種軟件,而且這些軟件不一定運行在個人電腦上,也可以是手機、平板、智能穿戴設備等等

  • 有時候不是傳生成好的 HTML 或者其他服務器上已經有的文件,而是傳輸經過一定邏輯處理後生成的字符串或者其他各種封裝好的數據

像前面提到的 HTML 需要有一定標準一樣,爲了防止混亂和雞同鴨講,我們又需要先對這些機器需要怎麼交互達成一定共識,再讓它們進行交流。人與人之間通信,需要先有一種大家都認識的寫法(比如簡體字/繁體字)和一種彼此都懂的語言(比如普通話/廣東話)。要讓這些形形×××的機器能夠通過網絡進行交互,我們就需要指明一種協議(比如 HTTP/HTTPS)和一種數據封裝格式(比如 HTML/XML),Web Server 提供的 Web Service,指的就是這種協議+格式的交流體系。不過 Web Service 的生態系統和 HTML 的標準不一樣,用戶可以選擇的協議和數據封裝格式更多,普通的網站訪問用的 HTTP + HTML 只是其中一種,一些封閉系統內的交流還可以自己定義一個協議和格式來用(比如 QQ)。

Web Service 傳輸的數據再經由本地客戶端(瀏覽器、QQ/微信,網遊客戶端等)的分析渲染,就能夠以普通人能夠理解的形式展現出來。此外還有一些 Web Service 並不是爲普通用戶設計的,像前面提到的微博API,是用來給程序猿進行二次開發的~

除了提供 Web Service, Web Server 還會兼顧很多功能,包括提供緩存,平衡負載,這樣在訪問量比較大的時候能有有條不紊地接客。常見的現成的 Web Server 有開源的 Apache、Nginx和微軟的IIS,你也可以用一些工具(比如 Node.js )自己定製一個。因爲 Web Server 需要比較好的性能,所以投產時用的 Web Server 通常是C/C++/Java寫的,但是其實很多語言都可以寫,而且配合上語言底層的優化和好的模型,其他語言寫的 Web Server也可以有不錯的表現。

PHP ,服務器腳本,Web Framework
開頭那張圖裏服務器接到請求之後可以給訪客發送對應的文件,但21世紀的服務器怎麼可能只會“接請求-發文件”這麼弱智的一招呢,人家還可以處理你上傳來的文件的!還可以接受你發過來的各種請求,去操作服務器本地的文件or數據庫的!要幹這些事,自然服務器那邊也少不了要有代碼了,這些代碼就是服務器腳本。前面說的 Web Service 傳輸的數據,主要也是由服務器腳本生成,再交由 Web Server ,按照某種協議套好整個響應的格式,返回給客戶端的。

同一個網址,每個人看到的頁面不一定是一樣的,比如知乎首頁的網址都是

http://www.zhihu.com/

但是沒登陸和登陸之後看到的東西不一樣,登陸之後每個人看到的導航欄的用戶信息,關注的動態,都不一樣。服務器腳本可以對這些不同的狀態,生成不同的頁面,交給 Web Server 返回給瀏覽器。
知乎的主頁給大家看到的 html 整體來說是差不多的,都有導航欄,左邊是關注的動態,右邊是廣告和邊欄,每一塊的整體構造大同小異,只是一些地方內容有所區別。服務器腳本就是利用已知的數據,在這些因人而異的地方填入相應的內容,生成給每個人看的頁面。
比如我的主頁,導航欄右邊的頭像和名字跟別人看到的不一樣,就是因爲這塊地方有一個放圖片的<img>標籤和一個寫名字的<span>標籤,服務器腳本在查詢本地的數據之後給我返回的頁面裏<img>的標籤填了我頭像的圖片鏈接,<span>標籤裏填了我的名字,給別人的頁面就填其他鏈接、其他名字,這樣每個人看到的頁面就不一樣了。

&amp;lt;img data-rawheight="56" data-rawwidth="597" src="https://pic1.zhimg.com/500c9bdd6b6397b46d07f249eec5b084_b.jpg" class="origin_image zh-lightbox-thumb" width="597" data-original="https://pic1.zhimg.com/500c9bdd6b6397b46d07f249eec5b084_r.jpg"&amp;gt;
&amp;lt;img data-rawheight="93" data-rawwidth="559" src="https://pic3.zhimg.com/0365d8e71411f27dccc90da76a1ac3c2_b.jpg" class="origin_image zh-lightbox-thumb" width="559" data-original="https://pic3.zhimg.com/0365d8e71411f27dccc90da76a1ac3c2_r.jpg"&amp;gt;
PHP 就是一種常見的用來寫服務器腳本的語言,其實只要是能拿來寫大家傳輸數據的通用接口(CGI)的語言都可以用來寫服務器腳本(也就是說幾乎所有編程語言都可以寫 = =b),只是因爲現成工具的豐富程度和專攻程度不一樣,所以有一些語言在寫服務器端腳本的時候會比較熱門。


爲了方便,我們在寫服務器腳本的時候,通常還會用個同語言寫的 Web Framework 來處理各種細節,防禦一些常見的***,提供跨站認證(比如用已有的微博賬號註冊其他網站)的接口,利用cookie處理登陸狀態和用戶設置,生成網頁模版之類的。如果你用 C# 或者 Visual Basic 寫服務器腳本,就可以用 這個框架實現這些功能,幫你省點麻煩。不過現在不少人是反過來爲了一個好用的 Web Framework 去選擇它對應的服務器腳本語言的。

一個普通網站訪問的過程
簡單概括一下,對於我們普通的網站訪問,涉及到的技術就是:

  1. 用戶操作瀏覽器訪問,瀏覽器向服務器發出一個 HTTP 請求;

  2. 服務器接收到 HTTP 請求,Web Server 進行相應的初步處理,使用服務器腳本生成頁面;

  3. 服務器腳本(利用Web Framework)調用本地和客戶端傳來的數據,生成頁面;

  4. Web Server 將生成的頁面作爲 HTTP 響應的 body,根據不同的處理結果生成 HTTP header,發回給客戶端;

  5. 客戶端(瀏覽器)接收到 HTTP 響應,通常第一個請求得到的 HTTP 響應的 body 裏是 HTML 代碼,於是對 HTML 代碼開始解析;

  6. 解析過程中遇到引用的服務器上的資源(額外的 CSS、JS代碼,圖片、音視頻,附件等),再向 Web Server 發送請求,Web Server 找到對應的文件,發送回來;

  7. 瀏覽器解析 HTML 包含的內容,用得到的 CSS 代碼進行外觀上的進一步渲染,JS 代碼也可能會對外觀進行一定的處理;

  8. 用戶與頁面交互(點擊,懸停等等)時,JS 代碼對此作出一定的反應,添加特效與動畫;

  9. 交互的過程中可能需要向服務器索取或提交額外的數據(局部的刷新,類似微博的新消息通知),一般不是跳轉就是通過 JS 代碼(響應某個動作或者定時)向 Web Server 發送請求,Web Server 再用服務器腳本進行處理(生成資源or寫入數據之類的),把資源返回給客戶端,客戶端用得到的資源來實現動態效果或其他改變。

注意這只是小網站裏比較常見的模型,大網站爲了解決規模問題還會有很多處理,每個環節都會有一些細微的差異,中間還會使用各種各樣的工具減輕服務器的壓力,提高效率,方便日常維護~

延伸閱讀 —— 那些看花眼的名詞
爲了方便調試,很多 Web Framework 會自帶一個簡單的 Web Server,或者有些 Web Server 會自帶一個簡單的 Web Framework ,實際部署到服務器上開放使用的時候爲了性能或者安全等多方面的考慮,可以把內置的 Web Server 換成其他的,比如 Apache 或者 Nginx (舉個栗子,知乎用的是 Tornado 做 Framework,Server 換成了 Nginx,見知乎使用了哪些框架和開源庫?)。如果是開源的東西,還可以在遵守開源協議的前提下自己改一下再用~

因爲後端不像前端已經有 HTML + CSS + JS 這樣的既定事實標準,服務器腳本與 Web Framework 的選擇很多,所以新手會聽到很多眼花繚亂的技術名詞的地方多在這裏~ 舉一些栗子,早年常見的服務器端語言有:

  • 開源的 PHP

  • Sun 公司的 JSP 中使用的 Java

  • 微軟的 ASP 中使用的 VBScript

現在在這方面的應用熱起來的語言有

  • Python,對應常見的 Framework 包括知乎和Quora有用到的 Tornado(其實是自帶 Framework 的 Web Server),社區很成熟的 Django (用戶包括 Instagram、Pinterest)等

  • Ruby,一般都用 Rails 這個 Framework,用戶包括 Github、早期的 Twitter 等

  • 逆天的 JavaScript,有了 Node.js 這個平臺,Web Server、服務器腳本和瀏覽器腳本全都可以用 JavaScript 來寫……Node.js上最常用的 Framework是Express

  • 微軟家的則跟着 轉移到了C# 或者 Visual Basic

  • Erlang,擅長大規模的併發,不少遊戲公司拿來寫服務器,靠幾十個工程師支撐幾億用戶的WhatsApp也是用的這個~

幾種常見的架構包括:

  • LAMP = Linux + Apache + MySQL + PHP(P還可能是Python或Perl。有時候L會改成W=Windows。),也就是服務器上的操作系統是 Linux,Web Server 用 Apache,數據庫用 MySQL,服務器腳本用 PHP,這些都是開源技術,網站起步時用起來的成本會比較低,所以是普通網站裏非常常見的架構(雖然對於發展得很大的網站會遇到很多瓶頸),Facebook就是這種,淘寶也曾經是。

  • J2EE,Java 世界的架構,通常是企業用的(銀行、大型公司,.etc),比較常見地還會搭配一種 UNIX 做操作系統,Apache 做 Web Server,Tomcat 轉換 JSP 到 Java 給服務器程序用(其實它也自帶 Web Server),Oracle 數據庫等等。不一定拿來建站,常常用來提供企業裏的各種需要用到網絡的業務。我們學校教務系統就是用J2EE做的=。= 淘寶現在也是從LAMP轉型到了這個。

  • ,微軟家的架構,通常會搭配 Windows Server 操作系統,SQL Server 數據庫,IIS 做 Web Server。StackOverflow和京東(曾經)就是這個架構。

  • 神奇的MEAN架構,MongoDB做數據庫,Express做 Web Framework,Angular 做前端的 JavaScript 框架,Node.js 用於編寫 Web Server。神奇之處在於這幾個東西的語言都是 JavaScript (MongoDB的實現不是,但與外界溝通用的語言是)。因爲是比較新的架構,還有待時間的考驗,不過被很多人(尤其是靠 JavaScript 吃飯的前端程序猿們)熱切關注。

  • 一般來說重點不在技術而且在乎成本的新網站比較喜歡用 LAMP,重視安全穩定和速度的企業和機構喜歡 J2EE,想省事的網站喜歡 ,比較 Geek 的網站和創業公司喜歡折騰各種 Python、Ruby、Node.js世界的東西,Google 這樣現成的技術都解決不了需求的超大型網站就自己折騰解決方案。

雖然可以用的語言和所屬體系五花八門,其實服務器端程序要做的事情本質上都差不多的,就好比自然世界中要表達“吃過了沒”這句話的意思,你可以用各種各樣的語言在各種各樣的場景裏表達出來~

鄭州婦科醫院×××:http://yyk.39.net/zz3/zonghe/1d426.html

  鄭州婦科醫院:http://jbk.39.net/yiyuanzaixian/sysdfkyy/

  鄭州婦科醫院×××:http://jbk.39.net/yiyuanzaixian/sysdfkyy/

  鄭州人流醫院:http://jbk.39.net/yiyuanfengcai/tsyl_sysdfkyy/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章