php原理簡述


語言有靜態語言和動態語言之分,靜態語言一般指先編譯后執行,動態語言一般只邊解釋邊執行。靜態語言包括c,c++,Java等,動態語言有PHP,JavaScript,Python等。

任何語言都可以設計成動態或者靜態,只是因為應用領域和需求不同而有了分別。編譯型語言一次編譯處處運行,更強調的是執行速度。而動態語言即時編寫即時運行,更關注的是靈活。語言沒有優劣,優劣的是一用語言的人。

跟開發語言相關的只是是編譯原理,大家了解一下就行,編譯語言一般的過程有詞法分析,語法分析,語法編譯,生成中間碼,存儲管理,優化等。    詞法分析的過程會去除所有空格以及注釋,所以這些都不會影響程序執行效率。

順便說一下php的APC(納入PHP擴展),XCODE,EACCELERATOR優化,這三款都是php加速器。通常情況下php的執行每一次都會有編譯成中間碼(OPCODE)的過程,而為了提高php的執行效率,加速器的原理就是緩存OPCODE,使得php程序只有第一次的時候進行編譯,以后每一次執行直接執行中間碼。(緩存是個非常重要的概念,比如模板編譯,靜態生成,文件緩存,數據庫緩存,memcache,nginx反向代理等)

 http://blog.csdn.net/luanlihun/article/details/19070413

下面說一下php語言本身的架構,如圖:

 

 

 

 

 

一般考慮php組成主要簡化分為3大塊,php內核,Zend引擎,擴展層:

 http://blog.csdn.net/luanlihun/article/details/19070413

PHP內核用來處理請求、文件流、錯誤處理等相關操作;

Zend引擎(ZE)用以將源文件轉換成機器語言,然后在虛擬機上運行它;

擴展層是一組函數、類庫和流,PHP使用它們來執行一些特定的操作。比如,我們需要MySQL擴展來連接MySQL數據庫; 當ZE執行程序時可能會需要連接若干擴展,這時ZE將控制權交給擴展,等處理完特定任務后再返還;最后,ZE將程序運行結果返回給PHP內核,它再將結果傳送給SAPI層,最終輸出到瀏覽器上。

 

Php外部通用通信接口SAPI簡介:

SAPI指的是PHP具體應用的編程接口, 就像PC一樣,無論安裝哪些操作系統,只要滿足了PC的接口規范都可以在PC上正常運行, PHP腳本要執行有很多種方式,通過Web服務器,或者直接在命令行下,也可以嵌入在其他程序中。

通常,我們使用Apache或者Nginx這類Web服務器來測試PHP腳本,或者在命令行下通過PHP解釋器程序來執行。 腳本執行完后,Web服務器應答,瀏覽器顯示應答信息,或者在命令行標准輸出上顯示內容。

我們很少關心PHP解釋器在哪里。雖然通過Web服務器和命令行程序執行腳本看起來很不一樣, 實際上它們的工作流程是一樣的。命令行參數傳遞給PHP解釋器要執行的腳本, 相當於通過url請求一個PHP頁面。腳本執行完成后返回響應結果,只不過命令行的響應結果是顯示在終端上。

腳本執行的開始都是以SAPI接口實現開始的。只是不同的SAPI接口實現會完成他們特定的工作,例如Apache的mod_php SAPI實現需要初始化從Apache獲取的一些信息,在輸出內容是將內容返回給Apache,其他的SAPI實現也類似。

腳本執行的開始都是以SAPI接口實現開始的。只是不同的SAPI接口實現會完成他們特定的工作,例如Apache的mod_php SAPI實現需要初始化從Apache獲取的一些信息,在輸出內容是將內容返回給Apache,其他的SAPI實現也類似。

MINIT    apache啟動的整個生命周期或者命令行的執行過程中,只執行一次

RINIT     腳本被請求是激活模塊

 

RSHUTDOWN 請求結束,或者腳本結束是運行。 Eg:可以記錄運行時間

MSHUTDOWN SAPI生命周期結束時執行。

 

 

 

單進程請求

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

 

 

多進程請求

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM