如來神掌第一式第十招----LAMP詳解

###############################################################################
# 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>    

 

  

經常使用配合軟件
  一、wordpress:https://codex.wordpress.org/zh-cn:Main_Page
  二、phpadmin:https://www.phpmyadmin.net/

5、術語掃盲

一、FastCGI:(http2.2 須要額外安裝 http2.4默認安裝)PHP-FPM(FastCGI Process Manager:FastCGI進程管理器)是一個PHPFastCGI管理器,對於PHP 5.3.3以前的php來講,是一個補丁包[1]  ,旨在將FastCGI進程管理整合進PHP包中。若是你使用的是PHP5.3.3以前的PHP的話,就必須將它patch到你的PHP源代碼中,在編譯安裝PHP後纔可使用;

CentOS 6:
    PHP-5.3.2-:默認不支持fpm機制;須要自行打補丁並編譯安裝;
    httpd-2.2:默認不支持fcgi協議,須要自行編譯此模塊;
    
    解決方案:編譯安裝httpd-2.4, php-5.3.3+;

CentOS 7:
    httpd-2.4:rpm包默認編譯支持了fcgi模塊;
    php-fpm包:專用於將php運行於fpm模式;

二、LAMP、LNMP區別

LNMP的工做原理
    首先,瀏覽器發送http request請求到服務器(Nginx),服務器響應並處理web請求,將一些靜態資源(CSS,圖片,視頻等)保存服務器上,而後將php腳本經過接口傳輸協議
(網關協議)PHP
-FCGI(fast-cgi)傳輸給PHP-FPM(進程管理程序),PHP-FPM不作處理,而後PHP-FPM調用PHP解析器進程,PHP解析器解析php腳本信息。PHP解析器進程能夠啓動多個,
進行併發執行。而後將解析後的腳本返回到PHP-FPM,PHP-FPM再經過fast-cgi的形式將腳本信息傳送給Nginx.服務器再經過Http response的形式傳送給瀏覽器。
瀏覽器再進行解析與渲染而後進行呈現。
LAMP的工做原理
瀏覽器向服務器發送http請求,服務器 (Apache) 接受請求,因爲php做爲Apache的組件模塊也會一塊兒啓動,它們具備相同的生命週期。Apache會將一些靜態資源保存,而後去調用
php處理模塊進行php腳本的處理。腳本處理完後,Apache將處理完的信息經過http response的方式發送給瀏覽器,瀏覽器解析,渲染等一系列操做後呈現整個網頁。
  Apache 2.x版本下提供了Prefork模式和Worker模式,鑑於PHP的第三方 擴展函數庫不少都是不支持多線程的,因此PHP官方和Zend官方強烈推 薦不要使用Worker模式,而是要麼
繼續使用Apache 1.3.x,要麼使用 Apache 2.x的Prefork模式 在Apache下,可使用CGI方式、Apache模塊方式(mod_php)、 FastCGI方式(mod_fastcgi和mod_fcgd)三種
方式來運行PHP,其中 mod_php最穩定,mod_fcgd性能最高,須要說明的是FastCGI方式運行 PHP存在必定風險,常常性會宕掉,不管是mod_fcgd仍是 mod_fastcgi。目前
Linux/FreeBSD/Solaris絕大部分PHP網站使用 Apache+Prefork+Mod_PHP方式,包括Qzone和QQ會員的全部PHP項 目。
二者的區別 在LNMP中,Nginx自己對腳本不作任何的處理,而是去調用一個PHP
-FPM的進程,兩者是相互獨立的。 在LAMP中,PHP是Apache的一個模塊,具備相同的生命週期。
相關文章
相關標籤/搜索