###############################################################################
# Name : Mahavairocana
# Author : Mahavairocana
# QQ : 10353512
# WeChat : shenlan-qianlan
# Blog : http://www.cnblogs.com/Mahavairocana/
# Description : You are welcome to reprint, or hyperlinks to indicate the
# source of the article, as well as author information. ###############################################################################php
1、LAMP簡介:html
l: Linux
a: apache (httpd)接收用戶的web請求;靜態資源則直接響應;動態資源爲php腳本,對此類資源的請求將交由php來運行;
m: mysql, mariadb 數據管理系統;
p: php, perl, python 運行程序;
WEB資源類型:
靜態資源:原始形式與響應內容一致;
動態資源:原始形式一般爲程序文件,須要在服務器端執行以後,將執行結果返回給客戶端; python
CGI:Common Gateway Interface
可讓一個客戶端,從網頁瀏覽器向執行在網絡服務器上的程序傳輸數據;CGI描述了客戶端和服務器程序之間傳輸的一種標準;mysql
請求流程:
Client -- (httpd) --> httpd -- (cgi) --> application server (program file) -- (mysql) --> mysql 程序員
靜態資源:Client -- http --> httpd
動態資源:Client -- http --> httpd --> libphp5.so ()
動態資源:Client -- http --> httpd --> libphp5.so () -- mysql --> MySQL server
php: 腳本編程語言、嵌入到html中的嵌入式web程序開發語言;
基於zend編譯成opcode(二進制格式的字節碼,重複運行,可省略編譯環境)web
2、關於PHP
1: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帶入了PHP 5時代。PHP5包含了許多重要的新特性,如加強的面向對象編程的支持、支持PDO(PHP Data Objects)擴展機制以及一系列對PHP性能的改進。
2:PHP Zend Engine
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。
3:PHP的Opcode
Opcode是一種PHP腳本編譯後的中間語言,就像Java的ByteCode,或者.NET的MSL。PHP執行PHP腳本代碼通常會通過以下4個步驟(確切的來講,應該是PHP的語言引擎Zend):
一、Scanning(Lexing) —— 將PHP代碼轉換爲語言片斷(Tokens)
二、Parsing —— 將Tokens轉換成簡單而有意義的表達式
三、Compilation —— 將表達式編譯成Opocdes
四、Execution —— 順次執行Opcodes,每次一條,從而實現PHP腳本的功能
掃描-->分析-->編譯-->執行
4:php的加速器
基於PHP的特殊擴展機制如opcode緩存擴展也能夠將opcode緩存於php的共享內存中,從而可讓同一段代碼的後續重複執行時跳過編譯階段以提升性能。由此也能夠看出,這些加速器並不是真正提升了opcode的運行速度,而僅是經過分析opcode後並將它們從新排列以達到快速執行的目的。
常見的php加速器有:
一、APC (Alternative PHP Cache)
遵循PHP License的開源框架,PHP opcode緩存加速器,目前的版本不適用於PHP 5.4。項目地址,http://pecl.php.net/package/APC。
二、eAccelerator
源於Turck MMCache,早期的版本包含了一個PHP encoder和PHP loader,目前encoder已經不在支持。項目地址, http://eaccelerator.net/。
三、XCache
快速並且穩定的PHP opcode緩存,通過嚴格測試且被大量用於生產環境。項目地址,http://xcache.lighttpd.net/
四、Zend Optimizer和Zend Guard Loader
Zend Optimizer並不是一個opcode加速器,它是由Zend Technologies爲PHP5.2及之前的版本提供的一個免費、閉源的PHP擴展,其可以運行由Zend Guard生成的加密的PHP代碼或模糊代碼。 而Zend Guard Loader則是專爲PHP5.3提供的相似於Zend Optimizer功能的擴展。項目地址,http://www.zend.com/en/products/guard/runtime-decoders
五、NuSphere PhpExpress
NuSphere的一款開源PHP加速器,它支持裝載經過NuSphere PHP Encoder編碼的PHP程序文件,並可以實現對常規PHP文件的執行加速。項目地址,http://www.nusphere.com/products/phpexpress.htm
5:PHP源碼目錄結構
PHP的源碼在結構上很是清晰。其代碼根目錄中主要包含了一些說明文件以及設計方案,並提供了以下子目錄:
一、build —— 顧名思義,這裏主要放置一些跟源碼編譯相關的文件,好比開始構建以前的buildconf腳本及一些檢查環境的腳本等。
二、ext —— 官方的擴展目錄,包括了絕大多數PHP的函數的定義和實現,如array系列,pdo系列,spl系列等函數的實現。 我的開發的擴展在測試時也能夠放到這個目錄,以方便測試等。
三、main —— 這裏存放的就是PHP最爲核心的文件了,是實現PHP的基礎設施,這裏和Zend引擎不同,Zend引擎主要實現語言最核心的語言運行環境。
四、Zend —— Zend引擎的實現目錄,好比腳本的詞法語法解析,opcode的執行以及擴展機制的實現等等。
五、pear —— PHP 擴展與應用倉庫,包含PEAR的核心文件。
六、sapi —— 包含了各類服務器抽象層的代碼,例如apache的mod_php,cgi,fastcgi以及fpm等等接口。
七、TSRM —— PHP的線程安全是構建在TSRM庫之上的,PHP實現中常見的*G宏一般是對TSRM的封裝,TSRM(Thread Safe Resource Manager)線程安全資源管理器。
八、tests —— PHP的測試腳本集合,包含PHP各項功能的測試文件。
九、win32 —— 這個目錄主要包括Windows平臺相關的一些實現,好比sokcet的實如今Windows下和*Nix平臺就不太同樣,同時也包括了Windows下編譯PHP相關的腳本。sql
3、安裝部署:超簡單shell
CentOS 7: Modules:程序包,httpd, php, php-mysql, mariadb-server FastCGI:程序包,httpd, php-fpm, php-mysql, mariadb-server CentOS 6: httpd, php, php-mysql, mysql-server
一、yum安裝;數據庫
yum install php php-mysql mysql httpdexpress
php-mysql :php鏈接mysql的驅動;
php 測試是否能夠連通數據庫
<?php $link=mysql_connect('127.0.0.1','root',''); if ($link) echo "Success" else echo "Fail" my
php 測試是否部署完成
<?php
phpinfo();
?>
在上面的配置文件中,因爲php以模塊化方式與httpd結合工做,根據httpd的mpm模式不一樣,
對於perfork模式使用libphp5模塊,worker和event模式則使用libphp5-zts模塊「yum -y install php-zts」
驗證php模塊已經被加載 httpd -M |grep php
php5_module (shared)
二、編譯安裝
編譯安裝lamp: httpd:編譯安裝,httpd-2.4 php5:編譯安裝,php-5.4 mairadb:通用二進制格式,mariadb-5.5 注意:任何一個程序包被編譯操做依賴到時,須要安裝此程序包的「開發」組件,其包名通常相似於name-devel-VERSION; httpd-2.4: # yum install pcre-devel apr-devel apr-util-devel openssl-devel # ./configure --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-rewrite --with-zlib
--with-pcre --with-apr=/usr --with-apr-util=/usr --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork # make -j 4 && make install php-5.4: # yum install libxml2-devel libmcrypt-devel # ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config
--enable-mbstring --with-png-dir --with-jpeg-dir --with-freetype-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets
--with-apxs2=/usr/local/apache24/bin/apxs --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 # make -j 4 && make install
4、配置文件詳解
配置文件: 服務配置文件:/etc/php-fpm.conf, /etc/php-fpm.d/*.conf php環境配置文件:/etc/php.ini, /etc/php.d/*.ini 鏈接池: pm = static|dynamic static:固定數量的子進程;pm.max_children; dynamic:子進程數據以動態模式管理; pm.start_servers pm.min_spare_servers pm.max_spare_servers ;pm.max_requests = 500 建立session目錄,並確保運行php-fpm進程的用戶對此目錄有讀寫權限; # mkdir /var/lib/php/session # chown apache.apache /var/lib/php/session (1) 配置httpd,添加/etc/httpd/conf.d/fcgi.conf配置文件,內容相似: DirectoryIndex index.php ProxyRequests Off ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1 (2) 虛擬主機配置 DirectoryIndex index.php <VirtualHost *:80> ServerName www.b.net DocumentRoot /apps/vhosts/b.net ProxyRequests Off ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/apps/vhosts/b.net/$1 <Directory "/apps/vhosts/b.net"> Options None AllowOverride None Require all granted </Directory> </VirtualHost>
經常使用配合軟件