深入瞭解php底層機制(-)

來源:互聯網
上載者:User

   作為一門動態語言,php是如何?的,其底層機制如何,具有什麼樣的特點,本文深入淺出介紹了包括php設計理念、整體結構、核心資料結構和變數在內的相關底層知識,對我們更好的開發php程式,最佳化效能等有一定的指導意義。TAGPhp 底層機制 效能最佳化目錄1、概述… 1what is php?. 1瞭解它底層實現的目的?. 12、php的設計理念及特點… 13、Php的四層體系… 24、Sapi 35、Php的執行流程&opcode. 56、HashTable — 核心資料結構… 67、Php變數… 8概述… 8Zval 9整數、浮點數類型變數… 10字串變數… 10陣列變數… 11資源類型變數… 11Php變數的範圍… 121、概述what is php?一種適用於web開發的動態語言。具體點說:就是一個用c語言實現包含大量組件的軟體架構。更狹義點看,可以把它認為是一個強大的ui架構。瞭解它底層實現的目的?動態語言要像用好首先得瞭解它

  記憶體管理、架構模型值得我們借鑒

  通過擴充開發實現更多更強大的功能,最佳化我們程式的效能

  2、php的設計理念及特點多進程模型

  由於php是多進程模型,不同請求間互不干涉,這樣保證了一個請求掛掉不會對全盤服務造成影響,當然,隨著時代發展,php也早已支援多執行緒模式。弱類型語言

  和c/c++、java、c#等語言不同,Php是一門弱類型語言:一個變數的類型並不是一開始就確定不變,運行中才會確定並可能發生隱式或顯式的類型轉換,這種機制的靈活性在web開發中非常方便、高效,具體會在後面php變數中詳述。引擎(Zend)+組件(ext)的模式降低內部耦合

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

  文法簡單靈活,沒有太多規範。(導致風格混雜)

  再差的程式員也不會寫出太離譜危害全域的程式。

  3、Php的四層體系Php的核心架構如下圖

圖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應用、在命令列下以指令碼方式運行等等。如果php是一輛車,那麼車的架構就是php本身

  Zend是車的引擎(發動機)

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

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

  而一次php程式的執行就是汽車跑在公路上。因此,我們需要:效能優異的引擎+合適的車輪+正確的跑道4、Sapi如前所述,sapi通過通過一系列的介面,使得外部應用可以和php交換資料並可以根據不同應用特點實現特定的處理方法,我們常見的一些sapi有:apache2handler

  這是以apache作為webserver,採用mod_php模式運行時候的處理方式,也是現在應用最廣泛的一種。cgi

  這是webserver和php直接的另一種互動方式,也就是大名鼎鼎的fastcgi協議,在最近今年fastcgi+php得到越來越多的應用,也是非同步webserver所唯一支援的方式。關於fastcgi和mod_php,可以參見另外一篇文章《php效能調研-mod_php vs fastcgi》cli

  命令列調用的應用模式 Sapi的定義及主要介面函數如下圖

圖2 Sapi協議這裡介紹一下其中一些主要函數startup:php被調用時初始化操作

  比如cgi模式,在startup的時候會載入所有的extension並執行模組初始化工作。shutdown:php關閉時收尾工作

  activate:請求初始化

  dectivate:請求結束時收尾工作

  ub_write:指定資料輸出方式

  比如apache2handler方式,由於php作為apache的一個so存在,因此其輸出也就是調用apache的ap_write函數,而在cgi模式下,會系統調用write。sapi_error:錯誤處理函數

  read_post:讀取post資料

  register_server_variables:往$_SERVER中註冊環境變數

  這個一般根據不同協議標準註冊註冊的變數。5、Php的執行流程&opcode我們先來看看php代碼的執行所經過的流程。

圖3 php代碼的執行過程從圖上可以看到,php實現了一個典型的動態語言執行過程:拿到一段代碼後,經過詞法解析、文法解析等階段後,來源程式會被翻譯成一個個指令(opcodes),然後ZEND虛擬機器順次執行這些指令完成操作。Php本身是用c實現的,因此最終調用的也都是c的函數,實際上,我們可以把php看做是一個c開發的軟體。 通過上面描述不難看出,php的執行的核心是翻譯出來的一條一條指令,也即opcodeu opcodeOpcode是php程式執行的最基本單位。一個opcode由兩個參數(op1,op2)、傳回值和處理函數組成。Php程式最終被翻譯為一組opcode處理函數的順序執行常見的幾個處理函數 ZEND_ASSIGN_SPEC_CV_CV_HANDLER : 變數分配 ($a=$b) ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER:函數調用 ZEND_CONCAT_SPEC_CV_CV_HANDLER:字串拼接 $a.$b ZEND_ADD_SPEC_CV_CONST_HANDLER: 加法運算 $a+2 ZEND_IS_EQUAL_SPEC_CV_CONST:判斷相等 $a==1 ZEND_IS_IDENTICAL_SPEC_CV_CONST:判斷相等 $a===16、HashTable — 核心資料結構HashTable是zend的核心資料結構,在php裡面幾乎並用來實現所有常見功能,我們知道的php數組即是其典型應用,此外,在zend內部,如函數符號表、全域變數等也都是基於hash table來實現。 php的hash table具有如下特點:支援典型的key->value查詢




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.