程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 由PHP底層工作原理說起

由PHP底層工作原理說起

編輯:關於PHP編程

之前做過.net,java開發,也寫過幾個Php的網站,似乎3種主要編程語言都接觸了。但是越來越覺得自己對編程的整個流程缺乏一個整體的認識,尤其是底層的機制。譬如網絡編程,編譯原理,服務器端,數據庫存儲引擎原理等。於是看了一些書,比較經典的有apue,unp,tcp/ip,nginx,mysql的innodb存儲引擎,深入理解jvm。漸漸發現無論用什麼語言做開發,背後都有linux,shell,c/c++,nginx服務器,mysql的身影。也許只有掌握了這些核心的原理知識,一個程序員才具有核心競爭力。

BAT的後端部分都是離不開這些核心技術的,只是前端(業務邏輯層)會有差別。譬如淘寶主要采用java,百度主要采用php。而騰訊是個工具控集團,主要采用c/c++技術。騰訊的主要的產品都是windows下的各種客戶端(qq,輸入法,music...最重要的是游戲)以及服務器端。相對而言,web產品是比較少的(qq空間,朋友網等),這些web產品以及比較成熟了,只是偶爾會做一下改進而已。除非有新的產品出現,不然不會有大量的人才需求。

雖然目前機器學習,大數據挖掘領域人才需求貌似比較旺盛,但是相關的技術還是要建立在Linux,jvm上面。某些公司對java人才的需求會進一步增長。

既然了解了c語言編譯以及連接的過程,java的jvm下的運行機制,突然好奇php的運行流程,機制和原理也。找了幾篇博客,大概了解了一下。先放到下面:

PHP底層工作原理

簡介
  先看看下面這個過程:

    我們從未手動開啟過PHP的相關進程,它是隨著Apache的啟動而運行的;PHP通過mod_php5.so模塊和Apache相連(具體說來是SAPI,即服務器應用程序編程接口);PHP總共有三個模塊:內核、Zend引擎、以及擴展層;PHP內核用來處理請求、文件流、錯誤處理等相關操作;Zend引擎(ZE)用以將源文件轉換成機器語言,然後在虛擬機上運行它;擴展層是一組函數、類庫和流,PHP使用它們來執行一些特定的操作。比如,我們需要mysql擴展來連接MySQL數據庫;當ZE執行程序時可能會需要連接若干擴展,這時ZE將控制權交給擴展,等處理完特定任務後再返還;最後,ZE將程序運行結果返回給PHP內核,它再將結果傳送給SAPI層,最終輸出到浏覽器上。

    深入探討
      等等,沒有這麼簡單。以上過程只是個簡略版,讓我們再深入挖掘一下,看看幕後還發生了些什麼。

      Apache啟動後,PHP解釋程序也隨之啟動;PHP的啟動過程有兩步;第一步是初始化一些環境變量,這將在整個SAPI生命周期中發生作用;第二步是生成只針對當前請求的一些變量設置。

      PHP啟動第一步
        不清楚什麼第一第二步是什麼?別擔心,我們接下來詳細討論一下。讓我們先看看第一步,也是最主要的一步。要記住的是,第一步的操作在任何請求到達之前就發生了。

        啟動Apache後,PHP解釋程序也隨之啟動;PHP調用各個擴展的MINIT方法,從而使這些擴展切換到可用狀態。看看php.ini文件裡打開了哪些擴展吧;MINIT的意思是“模塊初始化”。各個模塊都定義了一組函數、類庫等用以處理其他請求。

          一個典型的MINIT方法如下:
        PHP_MINIT_FUNCTION(extension_name){
        /* Initialize functions, classes etc */
        }
        PHP啟動第二步

          當一個頁面請求發生時,SAPI層將控制權交給PHP層。於是PHP設置了用於回復本次請求所需的環境變量。同時,它還建立一個變量表,用來存放執行過程中產生的變量名和值。PHP調用各個模塊的RINIT方法,即“請求初始化”。一個經典的例子是Session模塊的RINIT,如果在php.ini中啟用了Session模塊,那在調用該模塊的RINIT時就會初始化$_SESSION變量,並將相關內容讀入;RINIT方法可以看作是一個准備過程,在程序執行之間就會自動啟動。

            一個典型的RINIT方法如下:
          PHP_RINIT_FUNCTION(extension_name) {
          /* Initialize session variables, pre-populate variables, redefine global variables etc */
          }
          PHP關閉第一步
            如同PHP啟動一樣,PHP的關閉也分兩步:

            一旦頁面執行完畢(無論是執行到了文件末尾還是用exit或die函數中止),PHP就會啟動清理程序。它會按順序調用各個模塊的RSHUTDOWN方法。RSHUTDOWN用以清除程序運行時產生的符號表,也就是對每個變量調用unset函數。

              一個典型的RSHUTDOWN方法如下:
            PHP_RSHUTDOWN_FUNCTION(extension_name) {
            /* Do memory management, unset all variables used in the last PHP call etc */
            }
            PHP關閉第二步
              最後,所有的請求都已處理完畢,SAPI也准備關閉了,PHP開始執行第二步:

              PHP調用每個擴展的MSHUTDOWN方法,這是各個模塊最後一次釋放內存的機會。

                一個典型的RSHUTDOWN方法如下:
              PHP_MSHUTDOWN_FUNCTION(extension_name) {
              /* Free handlers and persistent memory etc */
              }
                這樣,整個PHP生命周期就結束了。要注意的是,只有在服務器沒有請求的情況下才會執行“啟動第一步”和“關閉第二步”。

              下面的是用一些圖示來說明的!

              PHP底層工作原理

              wps_clip_image-29471

              圖1 php結構

              從圖上可以看出,php從下到上是一個4層體系

              ①Zend引擎

              Zend整體用純c實現,是php的內核部分,它將php代碼翻譯(詞法、語法解析等一系列編譯過程)為可執行opcode的處理並實現相應的處理方法、實現了基本的數據結構(如hashtable、oo)、內存分配及管理、提供了相應的api方法供外部調用,是一切的核心,所有的外圍功能均圍繞zend實現。

              ②Extensions

              圍繞著zend引擎,extensions通過組件式的方式提供各種基礎服務,我們常見的各種內置函數(如array系列)、標准庫等都是通過extension來實現,用戶也可以根據需要實現自己的extension以達到功能擴展、性能優化等目的(如貼吧正在使用的php中間層、富文本解析就是extension的典型應用)。

              ③Sapi

              Sapi全稱是Server Application Programming Interface,也就是服務端應用編程接口,sapi通過一系列鉤子函數,使得php可以和外圍交互數據,這是php非常優雅和成功的一個設計,通過sapi成功的將php本身和上層應用解耦隔離,php可以不再考慮如何針對不同應用進行兼容,而應用本身也可以針對自己的特點實現不同的處理方式。後面將在sapi章節中介紹

              ④上層應用

              這就是我們平時編寫的php程序,通過不同的sapi方式得到各種各樣的應用模式,如通過webserver實現web應用、在命令行下以腳本方式運行等等。

              構架思想:

              引擎(Zend)+組件(ext)的模式降低內部耦合

              中間層(sapi)隔絕web server和php

              **************************************************************************

              如果php是一輛車,那麼

              車的框架就是php本身

              Zend是車的引擎(發動機)

              Ext下面的各種組件就是車的輪子

              Sapi可以看做是公路,車可以跑在不同類型的公路上

              而一次php程序的執行就是汽車跑在公路上。

              因此,我們需要:性能優異的引擎+合適的車輪+正確的跑道

              Apache和php的關系

              Apache對於php的解析,就是通過眾多Module中的php Module來完成的。

              wps_clip_image-31721

              把php最終集成到Apache系統中,還需要對Apache進行一些必要的設置。這裡,我們就以php的mod_php5 SAPI運行模式為例進行講解,至於SAPI這個概念後面我們還會詳細講解。

              假定我們安裝的版本是Apache2 和 Php5,那麼需要編輯Apache的主配置文件http.conf,在其中加入下面的幾行內容:

              Unix/Linux環境下:

              LoadModule php5_module modules/mod_php5.so

              AddType application/x-httpd-php .php

              注:其中modules/mod_php5.so 是X系統環境下mod_php5.so文件的安裝位置。

              Windows環境下:

              LoadModule php5_module d:/php/php5apache2.dll

              AddType application/x-httpd-php .php

              注:其中d:/php/php5apache2.dll 是在Windows環境下php5apache2.dll文件的安裝位置。

              這兩項配置就是告訴Apache Server,以後收到的Url用戶請求,凡是以php作為後綴,就需要調用php5_module模塊(mod_php5.so/ php5apache2.dll)進行處理。

              Apache的生命周期

              \

              Apach的請求處理流程

              \

              Apache請求處理循環詳解
              Apache請求處理循環的11個階段都做了哪些事情呢?(這11個階段難道就是nginx中對應的11個處理階段???)<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+CjGholBvc3QtUmVhZC1SZXF1ZXN0vde2zjwvcD4KPHA+CiAgICDU2tX9s6PH68fztKbA7cH3s8zW0KOs1eLKx8Sjv+m/ydLUsuXI67mz19O1xLXa0ru49r3Xts6ho7bU09rEx9Cpz+u63NTnvfjI67SmwO3H68fztcTEo7/pwLTLtaOs1eK49r3Xts6/ydLUsbvA+9PDoaM8L3A+CjxwPgogICAgMqGiVVJJIFRyYW5zbGF0aW9uvde2ziA8YnI+CiAgICBBcGFjaGXU2rG+vde2zrXE1vfSqrmk1/ejur2rx+vH87XEVVJM07PJ5LW9sb612M7EvP7Ptc2zoaPEo7/pv8nS1NTa1eK917bOsuXI67mz19OjrNa00NDX1Ly6tcTTs8nkwt+8raGjbW9kX2FsaWFzvs3Kx8D708PV4rj2vde2zrmk1/e1xKGjPC9wPgo8cD4KICAgIDOhokhlYWRlciBQYXJzaW5nvde2ziA8YnI+CiAgICBBcGFjaGXU2rG+vde2zrXE1vfSqrmk1/ejurzssunH68fztcTNt7K/oaPTydPaxKO/6b/J0tTU2sfrx/O0psDtwfezzLXEyM66ztK7uPa148nP1rTQ0LzssunH68fzzbeyv7XEyM7O8aOs0vK0y9XiuPa5s9fTutzJ2bG7yrnTw6GjbW9kX3NldGVudmlmvs3Kx8D708PV4rj2vde2zrmk1/e1xKGjPC9wPgo8cD4KICAgIDShokFjY2VzcyBDb250cm9svde2ziA8YnI+CiAgICBBcGFjaGXU2rG+vde2zrXE1vfSqrmk1/ejurj5vt3F5NbDzsS8/rzssunKx7fx1MrQ7bfDzsrH68fztcTXytS0oaNBcGFjaGW1xLHq17zC37ytyrXP1sHL1MrQ7brNvty++Na4we6ho21vZF9hdXRoel9ob3N0vs3Kx8D708PV4rj2vde2zrmk1/e1xKGjPC9wPgo8cD4KICAgIDWhokF1dGhlbnRpY2F0aW9uvde2ziA8YnI+CiAgICAgQXBhY2hl1Nqxvr3Xts61xNb30qq5pNf3o7qwtNXVxeTWw87EvP7J6LaotcSy38LUttTTw7unvfjQ0MjP1qSjrLKiyei2qNPDu6fD+8f40/Kho8Sjv+m/ydLU1NrV4r3Xts6y5cjrubPX06OsyrXP1tK7uPbIz9akt723qKGjPC9wPgo8cD4KICAgIDahokF1dGhvcml6YXRpb26917bOIDxicj4KICAgIEFwYWNoZdTasb6917bOtcTW99KquaTX96O6uPm+3cXk1sPOxLz+vOyy6crHt/HUytDtyM/WpLn9tcTTw7un1rTQ0Mfrx/O1xLLZ1/eho8Sjv+m/ydLU1NrV4r3Xts6y5cjrubPX06OsyrXP1tK7uPbTw7unyKjP3rncwO21xLe9t6ihozwvcD4KPHA+CiAgICA3oaJNSU1FIFR5cGUgQ2hlY2tpbme917bOIDxicj4KICAgIEFwYWNoZdTasb6917bOtcTW99KquaTX96O6uPm+3cfrx/PXytS0tcRNSU1FwODQzbXEz+C52Lnm1PKjrMXQtqi9q9KqyrnTw7XExNrI3bSmwO26r8r9oaOx6te8xKO/6W1vZF9uZWdvdGlhdGlvbrrNbW9kX21pbWXKtc/WwcvV4rj2ubPX06GjPC9wPgo8cD4KICAgIDihokZpeFVwvde2ziA8YnI+CiAgICDV4srH0ru49s2o08O1xL3Xts6jrNTK0O3Eo7/p1NrE2sjdyfqzycb31q7HsKOs1MvQ0MjOus6x2NKqtcS0psDtwfezzKGjus1Qb3N0X1JlYWRfUmVxdWVzdMDgJiMyMDI4NDujrNXiysfSu7j2xNy5u7K2u/HIzrrO0MXPorXEubPX06Os0rLKx9fus6PKudPDtcS5s9fToaM8L3A+CjxwPgogICAgOaGiUmVzcG9uc2W917bOIDxicj4KICAgIEFwYWNoZdTasb6917bOtcTW99KquaTX96O6yfqzybe1u9i/zbuntsu1xMTayN2jrLi61PC4+L/Nu6e2y7eiy83Su7j2x6G1sbXEu9i4tKGj1eK49r3Xts7Kx9X7uPa0psDtwfezzLXEusvQxLK/t9ahozwvcD4KPHA+CiAgICAxMKGiTG9nZ2luZ73Xts4gPGJyPgogICAgQXBhY2hl1Nqxvr3Xts61xNb30qq5pNf3o7rU2rvYuLTS0b6tt6LLzbj4v827p7bL1q6687zHwrzKws7xoaPEo7/pv8nE3NDeuMS78tXfzOa7u0FwYWNoZbXEserXvMjV1r68x8K8oaM8L3A+CjxwPgoxMaGiQ2xlYW5VcL3Xts4gPGJyPgogICAgQXBhY2hl1Nqxvr3Xts61xNb30qq5pNf3o7rH5cDtsb60zsfrx/PKws7xtKbA7c3qs8nWrrrz0sXB9LXEu7e+s6OsscjI587EvP6hosS/wry1xLSmwO278tXfU29ja2V0tcS52LHVtci1yKOs1eLKx0FwYWNoZdK7tM7H68fztKbA7bXE1+6689K7uPa917bOoaM8L3A+CjxwPgo8c3Ryb25nPkxBTVC83Lm5o7o8L3N0cm9uZz48L3A+CjxwPgo8aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20140607/20140607091102327.gif" alt="b簗﹊萟?钅裣i啔a篧殽?{鷌?*??s鈉拽?'瞝_椐鷌糙铻於?凓i嗃i?耉檐y?m4簖<]孔?喎?http://www.Bkjia.com/kf/qianduan/css/" target="_blank" class="keylink">html

              百度研發中心的博客http://stblog.baidu-tech.com/?p=763

              王興賓的博客http://blog.csdn.net/wanghao72214/article/details/3916825

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved