以圖明志

PHP服務器腳本

[專題] PHP內核探索:從SAPI接口開始

Zend SAPI Internals
SAPI提供了一個和外部通信的接口, 對于PHP5.2,默認提供了很多種SAPI, 常見的給apache的mod_php5,CGI,給IIS的ISAPI,還有Shell的CLI,本文就從CGI SAPI入手 ,介紹SAPI的機制。 雖然CGI簡單,但是不用擔心,它包含了絕大部分內容,足以讓你深刻理解SAPI的工作原理。

PHP服務器腳本

[專題] PHP內核探索:一次請求的開始與結束

MINIT與RINIT
PHP開始執行以后會經過兩個主要的階段:處理請求之前的開始階段和請求之后的結束階段。 開始階段有兩個過程:第一個過程是模塊初始化階段(MINIT), 在整個SAPI生命周期內(例如Apache啟動以后的整個生命周期內或者命令行程序整個執行過程中), 該過程只進行一次。

PHP服務器腳本

[專題] PHP內核探索:一次請求生命周期

PHP的啟動與關閉
我們從未手動開啟過PHP的相關進程,它是隨著Apache的啟動而運行的。PHP通過mod_php5.so模塊和Apache相連(具體說來是SAPI,即服務器應用程序編程接口)。PHP總共有三個模塊:內核、Zend引擎、以及擴展層。Apache啟動后,PHP解釋程序也隨之啟動。PHP的啟動過程有兩步……

PHP服務器腳本

[專題] PHP內核探索:單進程SAPI生命周期

處理一次請求后就關閉
CLI/CGI模式的PHP屬于單進程的SAPI模式。這類的請求在處理一次請求后就關閉。也就是只會經過如下幾個環節: 開始 - 請求開始 - 請求關閉 - 結束 SAPI接口實現就完成了其生命周期。

PHP服務器腳本

[專題] PHP內核探索:多進程/線程的SAPI生命周期

重復請求開始-請求關閉的環節
通常PHP是編譯為apache的一個模塊來處理PHP請求。Apache一般會采用多進程模式, Apache啟動后會fork出多個子進程,每個進程的內存空間獨立,每個子進程都會經過開始和結束環節, 不過每個進程的開始階段只在進程fork出來以來后進行,在整個進程的生命周期內可能會處理多個請求。

PHP服務器腳本

[專題] PHP內核探索:Zend引擎

Zend引擎是PHP實現的核心
Zend引擎是PHP實現的核心,提供了語言實現上的基礎設施。例如:PHP的語法實現,腳本的編譯運行環境, 擴展機制以及內存管理等,當然這里的PHP指的是官方的PHP實現(除了官方的實現, 目前比較知名的有facebook的hiphop實現,不過到目前為止,PHP還沒有一個標準的語言規范),而PHP則提供了請求處理和其他Web服務器的接口(SAPI)。

PHP服務器腳本

[專題] PHP內核探索:再次探討SAPI

很多操作都是通過SAPI接口實現
在PHP的生命周期的各個階段,一些與服務相關的操作都是通過SAPI接口實現。 這些內置實現的物理位置在PHP源碼的SAPI目錄。這個目錄存放了PHP對各個服務器抽象層的代碼, 例如命令行程序的實現,Apache的mod_php模塊實現以及fastcgi的實現等等。

PHP服務器腳本

[專題] PHP內核探索:Apache模塊介紹

PHP與Apache
Apache是基于模塊化設計的,總體上看起來代碼的可讀性高于php的代碼,它的核心代碼并不多,大多數的功能都被分散到各個模塊中,各個模塊在系統啟動的時候按需載入。你如果想要閱讀Apache的源代碼,建議你直接從main.c文件讀起,系統最主要的處理邏輯都包含在里面。

PHP服務器腳本

HTTP服務器是如何實現對PHP的支持的?

主流方案有三種
目前各種服務器HTTP Server對PHP的支持一共有三種:通過HTTP Server內置的模塊來實現,例如Apache的mod_php5,類似的Apache內置的mod_perl可以對perl支持;通過CGI來實現,這個就好比之前perl的CGI,該種方式的缺點是性能差,因為每次服務器遇到這些腳本都需要重新啟動腳本解析器來執行腳本然后將結果返回給服務器。

PHP服務器腳本

[專題] PHP內核探索:通過mod_php5支持PHP

Apache2的mod_php5模塊說明
Apache對PHP的支持是通過Apache的模塊mod_php5來支持的。如果希望Apache支持PHP的話,在./configure步驟需要指定--with-apxs2=/usr/local/apache2/bin/apxs 表示告訴編譯器通過Apache的mod_php5/apxs來提供對PHP5的解析。

PHP服務器腳本

[專題] PHP內核探索:Apache運行與鉤子函數

Apache的運行過程
Apache的運行分為啟動階段和運行階段。 在啟動階段,Apache為了獲得系統資源最大的使用權限,將以特權用戶root(*nix系統)或超級管理員Administrator(Windows系統)完成啟動, 并且整個過程處于一個單進程單線程的環境中。

PHP服務器腳本

[專題] PHP內核探索:嵌入式PHP

嵌入式PHP類似CLI
從PHP源碼目錄結構的介紹以及PHP生命周期可知:嵌入式PHP類似CLI,也是SAPI接口的另一種實現。 一般情況下,它的一個請求的生命周期也會和其它的SAPI一樣:模塊初始化=>請求初始化=>處理請求=>關閉請求=>關閉模塊。 當然,這只是理想情況。因為特定的應用由自己特殊的需求,只是在處理PHP腳本這個環節基本一致。

PHP服務器腳本

概念了解:CGI,FastCGI,PHP-CGI與PHP-FPM

各公共網關接口介紹
CGI全稱是“公共網關接口”(Common Gateway Interface),HTTP服務器與你的或其它機器上的程序進行“交談”的一種工具,其程序須運行在網絡服務器上。CGI可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環境變量。如php,perl,tcl等。

PHP服務器腳本

[專題] PHP內核探索:PHP的FastCGI

FastCGI的整個工作流程
PHP的CGI實現了Fastcgi協議,是一個TCP或UDP協議的服務器接受來自Web服務器的請求, 當啟動時創建TCP/UDP協議的服務器的socket監聽,并接收相關請求進行處理。隨后就進入了PHP的生命周期: 模塊初始化,sapi初始化,處理PHP請求,模塊關閉,sapi關閉等就構成了整個CGI的生命周期。

PHP服務器腳本

[專題] PHP內核探索:如何執行PHP腳本

Zend引擎是如何解釋PHP腳本的
機器只能理解機器語言,那這些語言是怎么被執行的呢, 一般這些語言都需要一個解釋器, 由解釋器來執行這些源碼, 實際上這些語言還是會經過編譯環節,只不過它們一般會在運行的時候實時進行編譯。為了效率,并不是所有語言在每次執行的時候都會重新編譯一遍, 比如PHP的各種opcode緩存擴展。

PHP服務器腳本

[專題] PHP內核探索:PHP腳本的執行細節

PHP-C-匯編-機器碼
眾所周知,計算機的CPU只能執行二進制的機器碼,每種CPU都有對應的匯編語言,匯編語言編譯器將匯編語言翻譯成二進制的機器語言,然后CPU開始執行這些機器碼。匯編語言作為機器語言與程序設計者之間的一個層,給我們帶來了很多方便,程序員不需要用晦澀的01數字來書寫程序,當然人們并不滿足這樣的一個進步,于是在匯編語言之上又多了一個層——C語言。
1 / 7 首頁 < Prev 1 2 3 4 5 Next > 尾頁 頁碼:
燃烧吧足球登陆 江苏11选5任三遗漏 养七彩变色龙赚钱 福彩开奖2017131 网络棋牌频道主持人 悦读赚钱下载 什么软件用微信赚钱 大奖新闻 今天福建11选5走势图 二六三股票 微信双色球 IAC真的能赚钱吗 好想加入 大乐透中奖规则明细图 甘肃11选5号码查询 巨蟹最不会赚钱 2017足球英锦赛分析 天津11选5分布走势图