在前面的章節中,我們了解到一個PHP文件在服務器端的執行過程包括以下兩個大的過程:
1. 遞給php程序需要執行的文件, php程序完成基本的準備工作后啟動PHP及Zend引擎, 加載注冊的擴展模塊。
1. 初始化完成后讀取腳本文件,Zend引擎對腳本文件進行詞法分析,語法分析。然后編譯成opcode執行。如過安裝了apc之類的opcode緩存, 編譯環節可能會被跳過而直接從緩存中讀取opcode執行。
在第二步中,詞法分析、語法分析,編譯中間代碼,執行中間代碼等各個部分統稱為Zend虛擬機。與Java、C#等編譯型語言相比,PHP少了一個手動編譯的過程,它們無需編譯即可運行,我們稱其為解釋性語言。Java有自己的Java虛擬機,它在多個平臺上實現統一語言;C#有自己的.NET虛擬機,它在單一平臺實現多種語言;PHP跟他們一樣,也有屬于自己的Zend虛擬機。它們在本質是相同的,它們都是抽象的計算機。這些虛擬機都是在某種較底層的語言上抽象出另外一種語言,有自己的指令集,有自己的內存管理體系。它們最終都會將抽象級別較高的語言實現轉化為抽象級別較低的語言實現,并且實現其它輔助功能,如內存管理,垃圾回收等機制,以減少程序員在具體實現上的工作,從而可以將更多的時間和精力投入到業務邏輯中。從抽象層次看,Zend虛擬機比Java等語言更高級一些,這里的高級不是說功能更強大或效率更高,簡單點說,Zend虛擬機離真正的機器實現更遠一些。最近這些年,語言的發展只是不斷的抽象,不斷的遠離機器,沒有根本性的變化。
本章,我們從虛擬機的前世今生講起,敘述Zend虛擬機的實現原理,關鍵的數據結構,并其中穿插一個關于語法實現的示例和源碼加密解密的過程說明。
- 第一章 準備工作和背景知識
- 第一節 環境搭建
- 第二節 源碼結構、閱讀代碼方法
- 第三節 常用代碼
- 第四節 小結
- 第二章 用戶代碼的執行
- 第一節 生命周期和Zend引擎
- 第二節 SAPI概述
- Apache模塊
- 嵌入式
- FastCGI
- 第三節 PHP腳本的執行
- 詞法分析和語法分析
- opcode
- opcode處理函數查找
- 第四節 小結
- 第三章 變量及數據類型
- 第一節 變量的結構和類型
- 哈希表(HashTable)
- PHP的哈希表實現
- 鏈表簡介
- 第二節 常量
- 第三節 預定義變量
- 第四節 靜態變量
- 第五節 類型提示的實現
- 第六節 變量的生命周期
- 變量的賦值和銷毀
- 變量的作用域
- global語句
- 第七節 數據類型轉換
- 第八節 小結
- 第四章 函數的實現
- 第一節 函數的內部結構
- 函數的內部結構
- 函數間的轉換
- 第二節 函數的定義,傳參及返回值
- 函數的定義
- 函數的參數
- 函數的返回值
- 第三節 函數的調用和執行
- 第四節 匿名函數及閉包
- 第五節 小結
- 第五章 類和面向對象
- 第一節 類的結構和實現
- 第二節 類的成員變量及方法
- 第三節 訪問控制的實現
- 第四節 類的繼承,多態及抽象類
- 第五節 魔術方法,延遲綁定及靜態成員
- 第六節 PHP保留類及特殊類
- 第七節 對象
- 第八節 命名空間
- 第九節 標準類
- 第十節 小結
- 第六章 內存管理
- 第一節 內存管理概述
- 第二節 PHP中的內存管理
- 第三節 內存使用:申請和銷毀
- 第四節 垃圾回收
- 新的垃圾回收
- 第五節 內存管理中的緩存
- 第六節 寫時復制(Copy On Write)
- 第七節 內存泄漏
- 第八節 小結
- 第七章 Zend虛擬機
- 第一節 Zend虛擬機概述
- 第二節 語法的實現
- 詞法解析
- 語法分析
- 實現自己的語法
- 第三節 中間代碼的執行
- 第四節 PHP代碼的加密解密
- 第五節 小結
- 第八章 線程安全
- 第二節 線程,進程和并發
- 第三節 PHP中的線程安全
- 第九章 錯誤和異常處理
- 第十章 輸出緩沖
- 第十六章 PHP語言特性的實現
- 第一節 循環語句
- foreach的實現
- 第二十章 怎么樣系列(how to)
- 附錄
- 附錄A PHP及Zend API
- 附錄B PHP的歷史
- 附錄C VLD擴展使用指南
- 附錄D 怎樣為PHP貢獻
- 附錄E phpt測試文件說明
- 附錄F PHP5.4新功能升級解析
- 附錄G:re2c中文手冊