总结之:CentOS6.5 LAMP的基本原理以及分主机架构解析
前言
LAMP
? ?LAMP(Linux-Apache-MySQL-PHP)網站架構是目前國際流行的Web框架,該框架包括:Linux操作系統,Apache網絡服務器,MySQL數據庫,Perl、PHP或者Python編程語言,所有組成產品均是開源軟件,是國際上成熟的架構框架,很多流行的商業應用都是采取這個架構,和Java/J2EE架構相比,LAMP具有Web資源豐富、輕量、快速開發等特點,微軟的.NET架構相比,LAMP具有通用、跨平臺、高性能、低價格的優勢,因此LAMP無論是性能、質量還是價格都是企業搭建網站的首選平臺。
正文
L-Linux
? ?Linux這個操作系統大家都再熟悉不過了、種類很多、版本也很多、各色各樣的什么款的都有、看個人喜歡而選擇、這里我們選用CentOS 6.5來說明問題。
A-Apache
? ?apache是什么玩意呢。
? ?其實apache早期是美國的一個官方組織所研發的一款web服務器、早期也就叫httpd、但是這個項目完成了之后、功能也很完善了、所以、大家都知道、一旦某個項目完成了之后就要解散組織了、那這些研發httpd的程序員就散發到各個軟件公司了、這些程序又都很喜歡這個軟件、不想讓自己的成果就這樣沒落了、httpd就像這些程序員的孩子一個、不想沒人管、于是他們就通過網絡互相組織起來維護這款web服務器、一旦發現有漏洞、就打補丁、需要新功能就開發、自發的組織起來、這就是早期的社區模型、所以在早期的httpd的基礎上給他打了很多的補丁、使得這個服務器的功能越來越強大、所以他們就把這個服務器稱為充滿補丁的服務器(a pachey server)、后來、美國的武裝***直升機叫apache、所以后來這個httpd服務器就叫apache了。
? ?自從apache出現之后、絕對是一個瘋狂的時期、出現后不久就迅速獲得了從們的青睞、因為他是開源軟件、被各家組織和公司所使用、可以到下面這個網站看看apache的市場占有比例。
? ?http://www.netcraft.com
? ?httpd其實是一種高度模塊化設計的、所以通常由核心和各種模塊所組成、這跟內核很相近、這個軟件也是由核心和各種外圍模塊組成的、核心可以理解為http的基本接收請求響應請求等、而模塊可以理解為:比如說一個用戶請求一個很大的頁面、那我們就想壓縮給客戶發送、那這個壓縮功能就是一個模塊、這種就是httpd的模塊分設計、他的模塊功能很多、這里就不一一例舉了、而通常又稱為DSO(Dynamic Shared Object)模型、動態模塊對象或動態共享對象、用得著模塊就裝載模塊、即使編譯了用不著也可以不讓模塊被裝載。
? ?httpd還有一個叫MP的機制(Multipath Processing Module)多道處理模塊、是httpd的一個特性、他不是一個模塊、是一種特性統稱、常用的模塊有:prefork、worker、event
? ?prefork:叫預fork、他的工作機制是一個進程響應一個請求
? ?worker:一個進程生成多個線程、一個線程響應一個請求
? ?event:這是真正意義上的單線程響應多個請求、而且要基于事件驅動
? ?這里不再詳細講述、前面的文章中我們已經詳細談過這個問題、可以參數前面的文章:總結之:CentOS 6.5 HTTPD服務的全面解讀及配置詳解(1)
M-mysql
? ?一個關系型數據庫的基本結構到底是怎么樣的呢:
? ?1、在最底層表現為兩類文件:一類叫數據文件、用戶可能看到的是數據、但我們最終要存放到文件中、另一類叫索引文件、索引其實是表中數據的一部分、只是把一某些字段抽取出來單獨做成一個文件給他排好序、對查找數據有很大的提升、但寫性能降底了、這是在物理層面上實現的兩類文件、這些個文件也是存放在某個目錄當中的、對mysql而言、數據庫表現為單個目錄。
? ?2、磁盤空間管理器:磁盤管理器是對數據文件內部數據組織結構管理的工具、對數據來講、為了持久存儲、數據都在磁盤上、但是我們知道、任何進程操作數據都不能在磁盤中進行的、要在內存中進行的、向用戶返回也是在內存中。
? ?3、緩沖區管理器:是將磁盤中管理的數據緩存在內存中的、通常而言、內存都是小于磁盤的、內存空間可能是不夠我們的數據使用的、哪些數據需要清理、哪些數據需要寫入磁盤中去、這些都是緩沖區所要完成的工作。
? ?4、存取方法接口:當我們從緩沖區中讀數據、寫數據、就得用到這個存取方法接口。
? ?5、事務:所謂事務、就是一個事情一次或多次操作的組合、而一個事務的管理系統有可能支持事務、也可能不支持事務、所謂支持事務、就是他能夠把多個語句當做一個來管理、要么同時執行、要么同時不執行、如果一個關系型數據庫支持事務、那一定要滿足ACID(A:原子性C:一致性I:隔離性D:持久性)的測試。
? ?隨機I/O對我們的機械式磁盤來講性能是非常差的、往磁盤里寫數據、順序I/O是最快的、所謂順序I/O就是在磁盤中找一段連續的空間、當磁盤尋道完成以后、連續完成寫操作、這就叫順序I/O、那事務日志就是順序I/O的一種表現、我們通過事務日志將用戶存放的數據操作原封不動的直接寫到事務日志中去、當你的事務完成了就立即寫到磁盤上去、但放的不是磁盤數據文件中、而是放到一個叫事務日志的文件、叫事務日志。
? ?在這個層面上、要完成事務的管理、就要有一個事務管理器了、其實早些年mysql不支持事務的、現在mysql的獨特結構有些存儲引擎支持了。
? ?隔離:那如果一個用戶往某個表中修改數據時、其他的用戶是不能完成同一個表的操作的、那怎么保證你在修改的時候別人不能改呢、所以事務管理器在依賴于鎖管理器、而對于鎖來講、還有一個叫粒度的概念、就要鎖多大范圍、比如操作一個用戶修改表中的某條數據、只鎖定用戶修改的那條數據就可以了、其他的用戶都可以修改其實的數據、而在早先時鎖的時候是把整張表都鎖起來的、粒度很粗糙、這就意味著并發性很低。
? ?假如說我們的事務剛好寫到日志中去、系統崩潰了、那數據只在日志中有、在數據文件中沒有、數據沒有那我們就認為這個數據是殘缺的、因此在開機時必須經把數據同步到數據文件中去、而這個過程就叫恢數據復的過程、所以就要有一個恢復管理器了。
? ?用戶完成數據庫操作靠的是sql(Struct Query Language結構化查詢語言)語句、這是一種編程語言、也是一個編程接口、或者說是一個命令接口、他定義了我們數據能夠接受一些類別的操作(DCL[Data Contorl Language 數據控制語言]\DDL[Data Defination Language 數據定義語言]\DML[Data Manipulation Language 數據操作語言])、而DDL就是用來創建表、索引等基本關系型數據庫的語句、如CREATE/ALTER/DROP、DML數據操作語言則是增刪查改這類的語句INSERT/DELETE/SELECT/UPDATE、DCL數據控制語言則實現創建用戶、授權和權限收回的、/GRANT/REVOKE、以上的這些統統都是SQL的查詢引擎。
? ?當這些語句寫入SQL時、需要有一個分析器來分析這些語句哪些是命令、哪些是參數、那分析完了之后就要執行了、那如果一個表中有多個索引、怎么知道用哪個索引查詢效率最高、性能性優呢、這就要計劃一下了、得把所有可用的查詢計劃都查詢出來、用查詢計劃器來完成這個步驟、計劃結束之后從中選擇一個開銷最小的、然而開銷最小的也未必是最好的、那我們就得做一下優化了、就得用到一個優化器了、還有一個叫求解器、查詢的結果的。
? ?當用戶并發多用戶請求時、mysql怎么響應呢、mysql是單進程響應多用戶請求的、內部是靠線程來實現的、每一個用戶連接用一個線程來響應、他是單進程多線程模型的、當然、他的線程也是有上限的、mysql內部有一個叫線程池的概念、一個池子里能裝的水是固定的了、那一個mysql的線程也是固定的、就要看你這個池的容量了、當你定義好這個線程池的大小時、就意味著你能夠接受多少個用戶并發的數量了、當然、這個池子的大小取決于系統資源的大小了、可以把他理解為中間鍵、是對連接管理的組件。
? ?ODBC(Open DataBase Connectivity):開放數據庫互聯、這種組件是一種通用的非常底層的連接庫、這種庫使得你使用任何語言連接任何一種關系型數據庫都能夠通用。
? ?32位的系統、32位的程序最大內存尋址能力是4G、但內核還要用去1G、因此單進程最大只能運行3G、對于mysql來說最多只能使用2.7G的內存、Intel公司早期的CPU產品的地址總線和地址寄存器的寬度為20位,即CPU的尋址能力為220=1048576字節=1M字節;286的地址總線和地址寄存器的寬度為24位,CPU的尋址能力為224=16M字節;386及386以上的地址總線和地址寄存器的寬度為32位,CPU的尋址能力為232=4096M字節=4G字節。
? ?在計算機內部數據在數據總線上傳遞的,每條傳輸線我們稱之為1位,各個傳輸線按序排列,他們之間是并行關系,地址總線也是一樣的,數據總線決定每次傳輸數據的大小,地址總線決定了cpu所能訪問的最大內存空間的大小,控制總線反映了數據的狀態和傳輸方式,它是地址總線的擴展和補充。
P-php
一、PHP簡介
? ? ? ? ?
? ?PHP是通用服務器端腳本編程語言,其主要用于web開發以實現動態web頁面,它也是最早實現將腳本嵌入HTML源碼文檔中的服務器端腳本語言之一。同時,php還提供了一個命令行接口,因此,其也可以在大多數系統上作為一個獨立的shell來使用。
? ?Rasmus Lerdorf于1994年開始開發PHP,起初他是一組被Rasmus Lerdorf稱作個人主頁工具(Personal Home Page Tool) 的Perl腳本, 這些腳本可以用于顯示作者的簡歷并記錄用戶對其網站的訪問。后來,Rasmus Lerdorf使用C語言將這些Perl腳本重寫為CGI程序,還為其增加了運行Web forms的能力以及與數據庫交互的特性,并將其重命名為個人主頁面表單解析器(Personal Home Page/Forms Interpreter)或"PHP/FI"。此時,PHP/FI已經可以用于開發簡單的動態web程序了,這即是PHP 1.0。1995年6月,Rasmus Lerdorf把它的PHP發布于comp.infosystems.www.authoring.cgi Usenet討論組,從此PHP以開源的方式開始走進人們的視野并走進人們的生活。1997年,其2.0版本發布。
? ?1997年,兩名以色列程序員Zeev Suraski和Andi Gutmans重寫的PHP的分析器(parser)成為PHP發展到3.0的基礎,而且從此將PHP重命名為PHP: Hypertext Preprocessor。叫起文本預處理器。此后,這兩名程序員開始重寫整個PHP核心,并于1999年發布了Zend Engine 1.0,這也意味著PHP 4.0的誕生。2004年7月,Zend Engine 2.0發布,由此也將PHP帶入了PHP5時代。PHP5包含了許多重要的新特性,如增強的面向對象編程的支持、支持PDO(PHP Data Objects)擴展機制以及一系列對PHP性能的改進。所以PHP到5.0才算真正成熟起來、并且流行來。
二、PHP Zend Engine (PHP的引擎)
? ?Zend Engine是開源的、PHP腳本語言的解釋器,它最早是由以色列理工學院(Technion)的學生Andi Gutmans和Zeev Suraski所開發,Zend也正是此二人名字的合稱。后來兩人聯合創立了Zend Technologies公司。
? ?Zend Engine 1.0于1999年隨PHP 4發布,由C語言開發且經過高度優化,并能夠做為PHP的后端模塊使用。Zend Engine為PHP提供了內存和資源管理的功能以及其它的一些標準服務,其高性能、可靠性和可擴展性在促進PHP成為一種流行的語言方面發揮了重要作用。
? ?Zend Engine的出現將PHP代碼的處理過程分成了兩個階段:首先是分析PHP代碼、把他做詞法分析、語法分析、語義分析等等并將其轉換為稱作Zend opcode的二進制格式(類似Java的字節碼),雖然是個解析器、中間多了一個步驟就是編譯、他是個解析器、但能夠實現運行時編譯、先編譯再執行、他編譯的不一是個二進制程序、而是字節碼程序。并將其存儲于內存中;第二階段是使用Zend Engine去執行這些轉換后的Opcode。
三、PHP的操作碼Opcode
? ?Opcode是一種PHP腳本編譯后的中間語言,就像Java的ByteCode,或者.NET的MSL。PHP執行PHP腳本代碼一般會經過如下4個步驟(確切的來說,應該是PHP的語言引擎Zend):
? ?1、Scanning(Lexing) —— 掃描 將PHP代碼轉換為語言片段(Tokens)
? ?2、Parsing —— 分析 將Tokens轉換成簡單而有意義的表達式
? ?3、Compilation —— 編譯 將表達式編譯成Opocdes
? ?4、Execution —— 執行 順次執行Opcodes,每次一條,從而實現PHP腳本的功能
四、php的加速器
? ?基于PHP的特殊擴展機制如opcode緩存擴展也可以將opcode緩存于php的共享內存中,從而可以讓同一段代碼的后續重復執行時跳過編譯階段以提高性能。由此也可以看出,這些加速器并非真正提高了opcode的運行速度,而僅是通過分析opcode后并將它們重新排列以達到快速執行的目的。
? ?常見的加速器有:
? ? ? ?APC(Alternative PHP Cahce)
? ? ? ?eAccekerator
? ? ? ?XCache
? ? ? ?Zend Optimizer、Zend Guard Loader
? ? ? ?NuSphere PhpExpress
? ?PHP-5.3.3以上的版本才支持基于fastCGI運行于獨立主機上的版本
五、PHP源碼目錄結構
? ?PHP的源碼在結構上非常清晰。其代碼根目錄中主要包含了一些說明文件以及設計方案,并提供了如下子目錄:
? ?1、build —— 顧名思義,這里主要放置一些跟源碼編譯相關的文件,比如開始構建之前的buildconf腳本及一些檢查環境的腳本等。
? ?2、ext —— 官方的擴展目錄,包括了絕大多數PHP的函數的定義和實現,如array系列,pdo系列,spl系列等函數的實現。 個人開發的擴展在測試時也可以放到這個目錄,以方便測試等。
? ?3、main —— 這里存放的就是PHP最為核心的文件了,是實現PHP的基礎設施,這里和Zend引擎不一樣,Zend引擎主要實現語言最核心的語言運行環境。
? ?4、Zend —— Zend引擎的實現目錄,比如腳本的詞法語法解析,opcode的執行以及擴展機制的實現等等。
? ?5、pear —— PHP 擴展與應用倉庫,包含PEAR的核心文件。
? ?6、sapi —— 包含了各種服務器抽象層的代碼,例如apache的mod_php,cgi,fastcgi以及fpm等等接口。
? ?7、TSRM —— PHP的線程安全是構建在TSRM庫之上的,PHP實現中常見的*G宏通常是對TSRM的封裝,TSRM(Thread Safe Resource Manager)線程安全資源管理器。
? ?8、tests —— PHP的測試腳本集合,包含PHP各項功能的測試文件。
? ?9、win32 —— 這個目錄主要包括Windows平臺相關的一些實現,比如sokcet的實現在Windows下和*Nix平臺就不太一樣,同時也包括了Windows下編譯PHP相關的腳本。
A,M,P是怎么聯動起來工作的呢:
? ?php這個解析器本身不跟任何任務器數據庫打交道、需要打交道的是使用相關語言開發的應用程序、我們在應用程序中如果說實現了數據操作、如果說通過mysql來讀取或存儲數據的話才有可以用到mysql、否則是用不著的、所在并非有php就一定用到mysql。
apache + php結合的方式大概幾種:
? ?第一種:把php編譯時直接編譯成apache的模塊、module模塊化的方式進行工作。
? ?第二種:CGI、通用網關接口、apache基于CGI跟hph通信
? ?第三種:fastcgi、他也是一種協議、在這種模塊下他們兩個是怎么結合的
? ?本來php是做為一個模塊或都是php解析器運行的、不是監聽在某個套接字上接收別人的請求的、而是讓別人調用為一個進程使用的、可能是做為別人的子進程在運行、但是工作在fastcgi這種模塊下的hph自行啟用為一個服務進程、他監聽在某個套接字上、隨時可以接受來自客戶端的請求的、他也是有一個主進程的、為了可以響應多個用戶的請求、他會啟用多個子進程、這些子進程我們也可以稱為工作進程、他也是有空閑進程的、一但有客戶請求他馬上使用空閑的進程響應客戶端的請求、將結果返回給前端的調用者、在php5.3.3版本之前他是沒有這個能力了、只能工作在模塊和CGI的方式下、而在5.3.3之后這個模塊直接被收進php模塊中、這種模塊就叫php-fpm。
? ?所以在以后編譯php時、要想跟apache結合、就要編譯成php-fpm、這是基于fastcgi工作的模式、并啟動這服務進程、也就意味著他是通過套接字跟前端的調用者通信、既然基于套按字通信了、那么前端的web服務器和后面的php服務器完全可以工作在不同的主機上、實現了所謂的分層機制。
? ?apache不會跟數據庫打交道、他是個靜態web服務器、跟數據庫打交道的是應用程序、作為應用程序的源驅動能夠基于某個API跟服務器之間建立會話、而后他會通過我們的mysql語句發送給數據庫、數據庫再將結果返回給應用程序、不是php進程、而是php進程中所執行的代碼。
PHP跟mysql怎么整合起來呢、php又怎么被httpd所調用呢
? ?首先httpd并不具備解析代碼的能力、他要依賴于php的解析器、接著php本身不依賴于mysql、他只是一個解析器、能執行代碼就OK了、那他什么時候用到mysql呢、如果要在mysql中存數據時才用到mysql、只是當php中有運行mysql語句時才用到mysql。
? ?php語言要想聯系mysql、通常用到php的驅動、rpm包的叫php_mysql、php跟mysql沒有一點關系、只有程序員在php中編寫mysql語句時才連接mysql來執行sql語句的。
? ?基于php-mysql去連接mysql只使用一個函數mysql_connect();而mysql_connect()正是php-mysql提供的一個API、只要指明要連接的服務器即可。
? ?
結束:
? ?以上都是LAMP的一些原理以及基礎、都是文字說明、很是枯燥無味、但我還是覺得整理出來并記錄下來會好點、等以后翻閱也方便點、下篇我們將來說說怎么實現LAMP分主機聯動起來工作、LAMP也可以不分主機、可以放在同一臺主機上也是可以工作的、這個完全沒有問題、不過當業務繁忙時一臺主機服務器恐怕是扛不住、所以要分主機實現。
轉載于:https://blog.51cto.com/tanxw/1386048
總結
以上是生活随笔為你收集整理的总结之:CentOS6.5 LAMP的基本原理以及分主机架构解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qt关于添加模块的说明
- 下一篇: python监控web扩张时间脚本