LAMP、Sphinx以及Ajax簡介

好久沒有寫文章了,下面貼一段論文中的內容:

 

1.1  Linux操作系統

 

Linux是一款免費的操作系統,用戶可以通過網絡或其他途徑免費獲得,並可以任意修改其源代碼。這是其他的操作系統所做不到的。正是由於這一點,來自全世界的無數程序員參與了Linux的修改、編寫工作,程序員可以根據自己的興趣和靈感對其進行改變。這讓Linux吸收了無數程序員的精華,不斷壯大。

Linux系統支持多用戶,多進程。多用戶保證了各個用戶之間的不僅能夠有自己的特殊權利,有個人的隱私,還能夠與其他用戶共同合作,共同完成某項任務。多進程的環境保證了各個任務之間能夠安全獨立地運行,現在linux系統以其穩定性,安全性,功能強大吸引了衆多客戶的青睞,包括開發人員用於開發工作和公司用作服務器使用。

 

1.2  Apache服務器

 

Apache服務器是Apache軟件基金會下面的一個出名的開源http server,它致力於開發能夠運行在現代流行操作系統(包括unixwindows)上的http服務器,目標是提供一個安全的,高效的,可擴展的服務器用以提供http服務,同時還保證跟當前的http標準同步。

當期web服務器的種類衆多,其中流行的有ApacheNginxLighttpd,還有微軟一家的IIS,雖然NginxLighttpd被衆多的人所推崇,但是Apache依然以它的強大和穩定佔據了很大的市場(其實我也是很推崇Nginx和Lighttpd的)。

1.2.1  基本原理

Apache2.0之前,它主要以多進程的方式進行工作,多進程方式的好處是編程相對比較容易,因爲幾乎不用考慮線程安全問題,所以安全性能是比較好的。但是弊端也是很多的,單個進程佔用的內存大,如果服務器需要同時併發處理多個http請求的話,那麼將會佔用系統大量的內存,這樣一來,系統將不能提供高併發的服務。Apache2.0以來,在支持POSIX線程的unix系統上,現在Apache能在混合多進程,多線程模式下運行,使很多配置的可伸縮性得到改善。

Apache HTTP服務器被設計爲一個強大、靈活的能夠在多種平臺上及不同的環境下工作的服務器。不同的平臺和不同的環境經常產生不同的需求,或是會爲了達到同樣的最佳效果而採用不同的方法。Apache憑藉它的模塊設計很好的適應了大量不同的環境。這一設計使得網站管理員能夠在編譯時和運行時憑藉載入不同的模塊來決定服務器的不同附加功能。這種設計方式就是所謂的多道處理模塊,是2.0以後引入的一個重要特性。沒有使用該方法之前,在windows操作系統下是採用模擬POSIX層的方法,這種方法容易引起很多bug和性能低下。

1.2.2  某些MPM簡介

l  prefork:這個處理模塊實現的是一個非線程化的,預進程化的web服務器,這種方式跟1.3版本差不多。它適用於非線程安全的庫(比如php語言,它的很多庫都不是線程安全的),因爲web服務器是通過一個進程處理一個請求,所以如果一個請求發生問題,不會波及到其他請求,穩定性方面是比較好的。

l  worker:這是一種支持多進程,多線程的處理模塊。由於使用線程來處理請求,所以可以併發處理的請求數相對比較多,同時系統資源的開銷小於基於進程的服務器。但是,它也使用了多進程,每個進程又有多個線程,以這種方式獲得基於進程的服務器的穩定性。PHP的官方文檔中提到不適合將這種方式應用到生產環境,因爲基於線程的處理處理請求的方式會給本身不是線程安全的php庫帶來危險。如果實在想用,那麼應該使用fast-cgi的方式。

l  perchild:運行守護進程被賦予不同的用戶id,配置文件中可以設置不同的用戶和組,然後指定進程給這些用戶和組服務,但這種方式還不甚完善,正在開發中。

l  mpm_winnt:這個處理模塊是windows平臺下面的一個默認處理模塊,也是唯一的一個。它使用單個控制進程創建一個子進程,然後這個子進程再創建多個線程來處理不同的請求。PHP官方文檔中提到,windows平臺下使用多線程的方式相對來說比較安全,因爲太多數的windows平臺下的php庫都是線程安全的。

 

1.3  MySQL數據庫

 

Mysql是世界上最出名的開源數據庫,它的用戶非常之多,包括googlefacebook,淘寶,騰訊,新浪等等各個公司。

1.3.1  MySQL簡介

Mysql數據庫支持多線程,在多cpu的機器上有較高的性能,使用c或者c++語言開發,能夠在不同平臺上進行編譯,使用。相對其它商業數據庫來說,它顯得比較簡潔,實用,但是也擁有數據庫的五臟六腑。

Mysql數據庫最大的一個特點是,它支持插件式的存儲引擎,這樣便於程序員對它編寫相應的擴張,這一特點也更能達到開源的目的。當前支持mysql的存儲引擎相當的豐富,其中比較出名的有myisaminnodBmemorymergendbblackhole等等。

1.3.2  重要存儲引擎簡介

l  MyISAMMySQL最早支持的存儲引擎,在mysql5.5之前都將其作爲默認存儲引擎。它支持較高的插入,查詢速度,支持表級鎖定,但是不支持事務——即數據庫裏面的ACID理論。

l  InnoDB支持事務,行級鎖定,支持外鍵。事務的支持是通過先寫日記的方式來實現的,如果機器出現故障或者其他原因導致數據丟失,錯亂等,則通過日記的內容對數據進行回滾。MySQL5.5之後將其作爲默認的存儲引擎。

l  BerkeleyDB支持事務和頁級鎖定。

l  Memory是基於哈希的方式,將所有數據,索引都置於內存當中的存儲引擎,由於沒有慢速的磁盤IO操作,所以它有很高的查詢,修改效率。但是由於將數據存儲在內存當中,所以當MySQL重啓時,數據將會被丟失。所以一般用作存儲臨時表。

l  MRG_MYISAM用來將一致的MyISAM存儲引擎的表進行快速的合併。

l  Ndbcluster是集羣存儲引擎,用於構建具有高容錯性的基於內存的表。可以將多臺電腦聯合起來使用,提供高性能,高可用的數據庫,適用於大數據量的存儲,比如數據倉庫等。

l  Sphinx是一個比較特殊的存儲引擎,雖然說是存儲引擎,但是它並沒有存儲數據,實際上它應該算是開源搜索引擎SphinxMySQL裏面的一個嵌入式客戶端。

 

1.4  PHP

 

PHP,即“PHP: Hypertext Preprocessor”,是一種被廣泛使用的開放源代碼多用途腳本語言,尤其適用於 web 開發並可以嵌入到 HTML 中去。其語法利用了 CJava Perl,非常容易學習。該語言的主要目標是讓 web 開發人員可以很快寫出動態生成的網頁,但 PHP 的功能遠不止如此。實際上,PHP可以用於服務器端腳本編程,命令行腳本,甚至編寫桌面應用程序。

PHP程序的運行過程是這樣的,首先進行解析,解析過程是將PHP進行詞法分析,將程序劃分成爲一個個的token。然後進行編譯,將token作爲輸入,產生可執行單元和類和函數表,這就是中間代碼。最後是執行過程,將中間代碼作爲輸入,執行器執行中間代碼後便產生最終的結果。

現代cpu的處理速度是相當的驚人,最普通的電腦每秒執行的指令都能超過1億次,所以像php這樣的動態語言,雖然沒有像靜態語言那樣先通過編譯產生可執行文件,而是每次執行的時候都要解析,編譯(其實使用一些擴展是可以去換存編譯結果的,這樣避免每次執行時的編譯過程,可以節省不少時間),但是由於處理器的速度比較快,另外由於動態語言本身相對比較簡單,上手快,所以在很多場合,動態語言都發揮着相當重要的作用。

 

1.5  Sphinx

 

Sphinx是一個開源的搜索服務器,它被設計成高性能的,可擴展的,簡單實用的搜索引擎。

它的工作原理是這樣的:以某個數據源(可以是數據庫裏面的數據,xml等)爲基礎,將這些數據源建立索引。我們都清楚,建立索引以後能夠快速地定位到某條記錄。Sphinx建立索引的速度是比較快的,而且它支持主索引和增量索引的方式。網上看到的數據,Sphinx創建索引的速度爲:創建100萬條記錄的索引只需34分鐘,創建1000萬條記錄的索引可以在50分鐘內完成,而只包含最新10萬條記錄的增量索引,重建一次只需幾十秒。

主索引對應的數據源是所有的數據,增量索引對應的數據源可以根據需要將其設置爲最近的一段時間的產生的數據。這樣的話,增量索引對應的數據源比較少,可以將其設置爲每隔幾分鐘就更新索引一次,另一方面,主索引對應的數據量相對比較大,可以將索引更新時間設置得相對長一些,或者將其設定在晚上,晚上的時候數據的訪問量不大。

下面以MySQL爲例,簡單說明Sphinx是如何工作的。Sphinx將數據表裏面的數據作爲數據源,這些數據源可以使用sql語句從數據表裏面靈活的選擇出所需要的數據。然後可以通過Sphinx的工具indexer來對這些數據源建立索引,建立索引是根據某個分詞表來進行的。Sphinx默認只支持英文的分詞,但是可以容易對其進行擴展,進而支持其他語言,包括中文。目前國內已經有人將Sphinx和中文分詞軟件包LibMMseg組合在一起形成coreseek,其意圖在於爲應用提供高速、低空間佔用、高結果相關度的中文全文搜索能力。建立完索引以後可以使用Sphinx的工具search對這些數據進行搜索測試,這時候由於已經建立了索引數據,所以搜索速度應該是比較快的。前面介紹MySQL的時候提到了Sphinx存儲引擎,這個時候便可以使用這個東西了,將Sphinx的服務searcd打開,監聽在某個端口上面。可以在MySQL中建立一個以Sphinx爲存儲引擎的數據表,此數據表連接到searchd服務,從而可以通過mysql語句,查詢Sphinx裏面的索引數據。

 

1.6  Ajax

 

Ajaxasynchronous javascript and xml的縮寫,它的工作原理是這樣的,通過javascript函數創建一個xmlhttprequest對象(不同的瀏覽器創建方式不一樣),這個對象可以以異步的方式向服務器發送http請求,然後將服務器返回的內容(這裏的內容格式可以是xmljson,或者是純文本數據)動態加載到頁面,從而避免了網頁的完全刷新,實現局部刷新或者是無刷新,給用戶一種友好的上網體驗。

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