通過上一篇文章的學習,我們已經對PHP的知識有了一個大概的瞭解,比如PHP是開源、免費、適合Web開發的服務端指令碼語言,適合進行Web網站的開發,PHP是解釋型語言,由Zend 引擎進行PHP語言的解析。本篇文章我們就接著上一篇文章的內容接著向下學習,通過查看PHP語言的源碼結構瞭解Zend,isapi、PHP擴充的相關知識。
PHP源碼下載地址:下載 選擇一個版本下載即可。PHP源碼結構如下所示。
目錄結構分析:
/ :主要包含一些說明檔案以及設計方案。Zend :Zend 引擎的實現目錄。包括詞法文法解析,OPCODE,提供語言運行環境。TSRM :安全執行緒資源管理員。build:放置一些和源碼編譯相關的一些檔案。ext :官方擴充目錄。包括array系列,pdo系列,spl系列等函數的實現。main :最為核心的檔案,實現PHP的基本設施。pear :PHP 擴充與應用倉庫。sapi :各種伺服器抽象層的代碼。例如apache的mod_php,cgi,fastcgi以及fpm等等介面。tests:PHP的測試指令碼集合。scripts:Linux 下的指令碼目錄。win32:Windows平台相關的一些實現。
這裡重點說一下Zend、ext、sapi三個目錄。 Zend
這裡再累述一下Zend引擎到底是什麼,又在PHP語言中扮演了什麼角色。
Zend Engine功能
先進性先行編譯(Compile),然後再執行(Execute)。
(1)詞法分析:將代碼切分為一個個的標記Toekn。
(2)文法分析(Parser):語法檢查。
(3)產生作業碼(opcode):Zend 引擎對這些 Token 進行編譯, 將代碼編譯為 opcode,並綁定相應的參數、和函數調用。
(4)執行(execute):Zend 引擎執行這些 opcode。
(5)記憶體管理
可以說,Zend 就是PHP的心臟,是它保證了PHP可以穩定、高效的運行。 ext
PHP 3.0以前的版本,代碼的耦合性太強,導致擴充很困難,在PHP 3.0以後的版本將PHP的功能進行了拆分,部分功能由相應的擴充來實現。
開啟該檔案夾,我們可以看到pdo、mysql、curl、dom、date等多個擴充。PHP擴充的這種架構極大降低了開發人員的開發成本、提高了擴充的靈活性。比如,我們想要使用通過PHP連結Mysql服務時,只需要通過mysql提供的函數操作即可。至於mysql擴充內部是如何通過socket通訊與Mysql服務建立聯絡以及互動的,這些我們統統不用關心,是不是很簡便。
至於擴充的添加以及擴充在Windows/Linux平台的差別,上一篇文章已經說過了,不再累述。 sapi
sapi:Server Application Programming Interface,服務端應用編程連接埠。上面我們已經說了PHP是如何執行的,那麼PHP又是如何被訪問告知要被執行的呢。沒錯,sapi就是起這個作用的。
常見的調用 SAPI 方式有以下四種:
(1)mod_php5:PHP module for Apache。
(2)CGI:Fork-And-Execute。
(3)Fastcgi:常駐 (Long-Live) 型的 CGI。
(4)CLI:PHP 命令列模式。
大的來分,上面四種模式可以分為兩大類:Web Server轉寄模式、命令列模式
第一、二、三屬於Web Server轉寄模式,第四種模式屬於命令列模式。
細分一下,四種模式又可以拆分三種:擴充模式、cgi模式、cli模式
第一種屬於擴充模式。Apache伺服器將php模組作為其擴充,當Apache伺服器接收到.php類型的請求時,會將請求分發給mod_php模組去處理,總的來說,這種模式對於高並發並不適用(至於為何不行後期會完善),但是處理效率還是可以的。
第二、三種都屬於CGI模式。這個時候,當Nginx、lighttpd等Web Server接收到.php檔案請求時,會通過cgi介面將請求分發給Zend去解析,最終返回。這種模式目前應用比較廣泛。
第三種屬於CLI模式。顧名思義,就是可以在命令列下執行.php檔案,這種方式不需要進行Web Server的轉寄。目前這種模式在很多地方都受限,應用並不廣泛。
OK,最後附上一張PHP體繫結構圖
參考文章:Zend Engine & PHP