Linux基礎(chǔ)教程之LAMP組合深入講解(一)
lamp
php
- php: 腳本編程語言、嵌入到html中的嵌入式web程序開發(fā)語言;基于zend編譯成opcode(二進(jìn)制格式的字節(jié)碼,重復(fù)運(yùn)行,可省略編譯環(huán)境)
-
一、PHP簡介 PHP是通用服務(wù)器端腳本編程語言,其主要用于web開發(fā)以實(shí)現(xiàn)動態(tài)web頁面,它也是最早實(shí)現(xiàn)將腳本嵌入HTML源碼文檔中的服務(wù)器端腳本語言之一。同時(shí),php還提供了一個(gè)命令行接口,因此,其也可以在大多數(shù)系統(tǒng)上作為一個(gè)獨(dú)立的shell來使用。 Rasmus Lerdorf于1994年開始開發(fā)PHP,它是初是一組被Rasmus Lerdorf稱作“Personal Home Page Tool” 的Perl腳本, 這些腳本可以用于顯示作者的簡歷并記錄用戶對其網(wǎng)站的訪問。后來,Rasmus Lerdorf使用C語言將這些Perl腳本重寫為CGI程序,還為其增加了運(yùn)行Web forms的能力以及與數(shù)據(jù)庫交互的特性,并將其重命名為“Personal Home Page/Forms Interpreter”或“PHP/FI”。此時(shí),PHP/FI已經(jīng)可以用于開發(fā)簡單的動態(tài)web程序了,這即是PHP 1.0。1995年6月,Rasmus Lerdorf把它的PHP發(fā)布于comp.infosystems.www.authoring.cgi Usenet討論組,從此PHP開始走進(jìn)人們的視野。1997年,其2.0版本發(fā)布。 1997年,兩名以色列程序員Zeev Suraski和Andi Gutmans重寫的PHP的分析器(parser)成為PHP發(fā)展到3.0的基礎(chǔ),而且從此將PHP重命名為PHP: Hypertext Preprocessor。此后,這兩名程序員開始重寫整個(gè)PHP核心,并于1999年發(fā)布了Zend Engine 1.0,這也意味著PHP 4.0的誕生。2004年7月,Zend Engine 2.0發(fā)布,由此也將PHP帶入了PHP 5時(shí)代。PHP5包含了許多重要的新特性,如增強(qiáng)的面向?qū)ο缶幊痰闹С?、支持PDO(PHP Data Objects)擴(kuò)展機(jī)制以及一系列對PHP性能的改進(jìn)。 二、PHP Zend Engine Zend Engine是開源的、PHP腳本語言的解釋器,它最早是由以色列理工學(xué)院(Technion)的學(xué)生Andi Gutmans和Zeev Suraski所開發(fā),Zend也正是此二人名字的合稱。后來兩人聯(lián)合創(chuàng)立了Zend Technologies公司。 Zend Engine 1.0于1999年隨PHP 4發(fā)布,由C語言開發(fā)且經(jīng)過高度優(yōu)化,并能夠做為PHP的后端模塊使用。Zend Engine為PHP提供了內(nèi)存和資源管理的功能以及其它的一些標(biāo)準(zhǔn)服務(wù),其高性能、可靠性和可擴(kuò)展性在促進(jìn)PHP成為一種流行的語言方面發(fā)揮了重要作用。 Zend Engine的出現(xiàn)將PHP代碼的處理過程分成了兩個(gè)階段:首先是分析PHP代碼并將其轉(zhuǎn)換為稱作Zend opcode的二進(jìn)制格式(類似Java的字節(jié)碼),并將其存儲于內(nèi)存中;第二階段是使用Zend Engine去執(zhí)行這些轉(zhuǎn)換后的Opcode。 三、PHP的Opcode Opcode是一種PHP腳本編譯后的中間語言,就像Java的ByteCode,或者.NET的MSL。PHP執(zhí)行PHP腳本代碼一般會經(jīng)過如下4個(gè)步驟(確切的來說,應(yīng)該是PHP的語言引擎Zend): 1、Scanning(Lexing) —— 將PHP代碼轉(zhuǎn)換為語言片段(Tokens) 2、Parsing —— 將Tokens轉(zhuǎn)換成簡單而有意義的表達(dá)式 3、Compilation —— 將表達(dá)式編譯成Opocdes 4、Execution —— 順次執(zhí)行Opcodes,每次一條,從而實(shí)現(xiàn)PHP腳本的功能 掃描-->分析-->編譯-->執(zhí)行 四、php的加速器 基于PHP的特殊擴(kuò)展機(jī)制如opcode緩存擴(kuò)展也可以將opcode緩存于php的共享內(nèi)存中,從而可以讓同一段代碼的后續(xù)重復(fù)執(zhí)行時(shí)跳過編譯階段以提高性能。由此也可以看出,這些加速器并非真正提高了opcode的運(yùn)行速度,而僅是通過分析opcode后并將它們重新排列以達(dá)到快速執(zhí)行的目的。 常見的php加速器有: 1、APC (Alternative PHP Cache) 遵循PHP License的開源框架,PHP opcode緩存加速器,目前的版本不適用于PHP 5.4。項(xiàng)目地址,http://pecl.php.net/package/APC。 2、eAccelerator 源于Turck MMCache,早期的版本包含了一個(gè)PHP encoder和PHP loader,目前encoder已經(jīng)不在支持。項(xiàng)目地址, http://eaccelerator.net/。 3、XCache 快速而且穩(wěn)定的PHP opcode緩存,經(jīng)過嚴(yán)格測試且被大量用于生產(chǎn)環(huán)境。項(xiàng)目地址,http://xcache.lighttpd.net/ 4、Zend Optimizer和Zend Guard Loader Zend Optimizer并非一個(gè)opcode加速器,它是由Zend Technologies為PHP5.2及以前的版本提供的一個(gè)免費(fèi)、閉源的PHP擴(kuò)展,其能夠運(yùn)行由Zend Guard生成的加密的PHP代碼或模糊代碼。 而Zend Guard Loader則是專為PHP5.3提供的類似于Zend Optimizer功能的擴(kuò)展。項(xiàng)目地址,http://www.zend.com/en/products/guard/runtime-decoders 5、NuSphere PhpExpress NuSphere的一款開源PHP加速器,它支持裝載通過NuSphere PHP Encoder編碼的PHP程序文件,并能夠?qū)崿F(xiàn)對常規(guī)PHP文件的執(zhí)行加速。項(xiàng)目地址,http://www.nusphere.com/products/phpexpress.htm 五、PHP源碼目錄結(jié)構(gòu) PHP的源碼在結(jié)構(gòu)上非常清晰。其代碼根目錄中主要包含了一些說明文件以及設(shè)計(jì)方案,并提供了如下子目錄: 1、build —— 顧名思義,這里主要放置一些跟源碼編譯相關(guān)的文件,比如開始構(gòu)建之前的buildconf腳本及一些檢查環(huán)境的腳本等。 2、ext —— 官方的擴(kuò)展目錄,包括了絕大多數(shù)PHP的函數(shù)的定義和實(shí)現(xiàn),如array系列,pdo系列,spl系列等函數(shù)的實(shí)現(xiàn)。 個(gè)人開發(fā)的擴(kuò)展在測試時(shí)也可以放到這個(gè)目錄,以方便測試等。 3、main —— 這里存放的就是PHP最為核心的文件了,是實(shí)現(xiàn)PHP的基礎(chǔ)設(shè)施,這里和Zend引擎不一樣,Zend引擎主要實(shí)現(xiàn)語言最核心的語言運(yùn)行環(huán)境。 4、Zend —— Zend引擎的實(shí)現(xiàn)目錄,比如腳本的詞法語法解析,opcode的執(zhí)行以及擴(kuò)展機(jī)制的實(shí)現(xiàn)等等。 5、pear —— PHP 擴(kuò)展與應(yīng)用倉庫,包含PEAR的核心文件。 6、sapi —— 包含了各種服務(wù)器抽象層的代碼,例如apache的mod_php,cgi,fastcgi以及fpm等等接口。 7、TSRM —— PHP的線程安全是構(gòu)建在TSRM庫之上的,PHP實(shí)現(xiàn)中常見的*G宏通常是對TSRM的封裝,TSRM(Thread Safe Resource Manager)線程安全資源管理器。 8、tests —— PHP的測試腳本集合,包含PHP各項(xiàng)功能的測試文件。 9、win32 —— 這個(gè)目錄主要包括Windows平臺相關(guān)的一些實(shí)現(xiàn),比如sokcet的實(shí)現(xiàn)在Windows下和*Nix平臺就不太一樣,同時(shí)也包括了Windows下編譯PHP相關(guān)的腳本。
- 配置文件:/etc/php.ini, /etc/php.d/*.ini
- 配置文件在php解釋器啟動時(shí)被讀取,因此,對配置文件的修改如何生效?
Modules:重啟httpd服務(wù);
FastCGI:重啟php-fpm服務(wù);
- 配置文件在php解釋器啟動時(shí)被讀取,因此,對配置文件的修改如何生效?
- ini
vi /etc/php.ini [foo]:Section Header directive = value 注釋符:較新的版本中,已經(jīng)完全使用;進(jìn)行注釋; #:純粹的注釋信息 ;:用于注釋可啟用的directive
php.ini的核心配置選項(xiàng)文檔:http://php.net/manual/zh/ini.core.php
php.ini配置選項(xiàng)列表:http://php.net/manual/zh/ini.list.php<?php ...php code... ?>
-
lamp
- WEB資源類型:
- 靜態(tài)資源:原始形式與響應(yīng)內(nèi)容一致;
動態(tài)資源:原始形式通常為程序文件,需要在服務(wù)器端執(zhí)行之后,將執(zhí)行結(jié)果返回給客戶端;- 客戶端技術(shù): javascript
服務(wù)器端技術(shù):php, jsp
- 客戶端技術(shù): javascript
- 靜態(tài)資源:原始形式與響應(yīng)內(nèi)容一致;
- CGI:Common Gateway Interface
可以讓一個(gè)客戶端,從網(wǎng)頁瀏覽器向執(zhí)行在網(wǎng)絡(luò)服務(wù)器上的程序傳輸數(shù)據(jù);CGI描述了客戶端和服務(wù)器程序之間傳輸?shù)囊环N標(biāo)準(zhǔn); - amp
- a: apache (httpd)
m: mysql, mariadb
p: php, perl, Python - httpd:接收用戶的web請求;靜態(tài)資源則直接響應(yīng);動態(tài)資源為php腳本,對此類資源的請求將交由php來運(yùn)行;
php:運(yùn)行php程序;
MariaDB:數(shù)據(jù)管理系統(tǒng);- httpd與php結(jié)合的方式:
modules (把php編譯成為httpd的模塊)
FastCGI:php-fpm
- httpd與php結(jié)合的方式:
- amp組合方式:
client --> http protocol --> httpd + php module --> (php-mysql, mysql protocol) --> mysqld client --> http protocol --> httpd --> fastcgi protocol --> fpm (php application server) --> (php-mysql, mysql protocol) --> mysqld
- a: apache (httpd)
- 快速部署amp:
- CentOS 7:
- Modules:程序包,httpd, php, php-mysql, mariadb-server
啟動的服務(wù):systemctl start mariadb.service httpd.service - FastCGI:程序包,httpd, php-fpm, php-mysql, mariadb-server
啟動的服務(wù):systemctl start mariadb.service php-fpm.service httpd.service
- Modules:程序包,httpd, php, php-mysql, mariadb-server
- CentOS 6:
- Modules:程序包,httpd, php, php-mysql, mysql-server
啟動的服務(wù):service mysqld start, service httpd start
- Modules:程序包,httpd, php, php-mysql, mysql-server
- CentOS 7:
- php測試代碼
<php? phpinfo(); ?>
示例:
<html> <title>PHP Page</title> <body> <h1>PHP Info Page</h1> <?php phpinfo(); ?> </body> </html>
- php連接mysql的測試代碼:
<?php $conn = mysql_connect('172.16.100.67','testuser','testpass'); if ($conn) echo "OK"; else echo "Failure"; ?>