理解Php的運行機制

PHP是一種純解釋型在服務端執行的可以內嵌HTML的腳本語言,尤其適合開發Web應用程序。

請求一個 PHP 腳本時,PHP 會讀取該腳本,並將其編譯爲 Zend 操作碼,這是要執行的代碼的一種二進制表示形式。隨後,此操作碼由 PHP 執行並丟棄。 PHP腳本在每次被解釋時進行初始化,在解釋完畢後終止運行。這種運行是互相獨立的,每一次請求都會創建一個單獨的進程或線程,來解釋相應的頁面文件。頁 面創建的變量和其他對象,都只在當前的頁面內部可見,無法跨越頁面訪問。在終止運行後,頁面中申請的、沒有被代碼顯式釋放的外部資源,包括內存、數據庫連 接、文件句柄、Socket連接等,都會被強行釋放。也就是說,PHP無法在語言級別上實現直接訪問跨越頁面的變量,也無法創建駐留內存的對象。

PHP這種獨特的工作模型的優勢在於,基本上解決了令人頭疼的資源泄漏問題。Web應用的特點是大量的、短時間的併發處理,對各種資源的申請和釋放 工作非常頻繁,很容易導致泄漏甚至崩潰。PHP的運行機制決定它不存在常規的崩潰問題(頂多連接超時腳本停止執行),可以說PHP是較穩定的Web應用。 但是,這種機制的缺點也非常明顯。最直接的後果是,PHP在語言級別無法實現跨頁面的緩衝機制。這種緩衝機制缺失造成的影響,可以分成兩個方面:

一是對象的緩衝。衆所周知,很多設計模式都依賴於對象的緩衝機制,創建和銷燬對象是很費時間的,因爲創建一個對象要獲取內存資源或者其它更多資源, 對於需要頻繁應付大量併發的服務端軟件更是如此。因此,對象緩衝的缺失,理論上會極大地降低速度。應儘可能減少創建和銷燬對象的次數來提高服務程序的效 率,由於 PHP目前還不支持多線程,也就無法像Java一樣通過線程池調度來彌補這一缺陷;但可以使用第三方軟件如Memcachd來實現PHP的對象緩衝機制, 達到減少對象創建和銷燬的時間來提高服務程序的效率。Memcachd將PHP編譯後的 操作碼緩存並在內存中保存這個操作碼,並在下一次調用該頁面時重用它,這會節省很多時間。比較常用的緩存還有有 eAccelerator,另一種流行的 eAccelerator 替代工具是 Alternative PHP Cache(APC)。

二是數據庫連接的緩衝。對於MySQL,PHP提供了一種內置的數據庫緩衝機制,即用mysql_pconnect()代替 mysql_connect() 來打開數據庫而已。PHP會自動回收被廢棄的數據庫連接,以供重複使用。在實際應用中,這種持久性數據庫連接往往會導致數據庫連接的僞泄漏現象:在某個時 間,併發的數據庫連接過多,超過了MySQL的最大連接數,從而導致新的進程無法連接數據庫。但是過一段時間,當併發數減少時,PHP會釋放掉一些連接, 網站又會恢復正常。出現這種現象的原因是,當使用pconnect時,Apache 的httpd進程會不釋放connect,而當Apache的httpd進程數超過了mysql的最大連接數時,就會出現無法連接的情況。因此,需要小心 地調整Apache和Mysql的配置,以使Apache的httpd進程數不會超出MySQL的最大連接數。筆者經過實踐,在PHP5和 Oracle10g的連接中,由於頻於數據庫連接,有時候還會出現數據庫丟失連接的情況(Oracle官方有針對PHP的增強包,不知是否可以解決此問 題,筆者未試)。

PHP的工作模型即是缺點也是優勢,從本質上說,這就是PHP 的獨特之處。

若以FastCGI模式運行php,解析php.ini、載入全部擴展並重初始化全部數據結構這些都只在進程啓動時發生一次。一個額外的好處是,持續數據庫連接可以工作。Nginx+PHP(FastCGI)是個不錯的選擇。

轉自:http://hi.baidu.com/snailzzz/blog/item/3fd124f499d79dddf2d38581.html

還有一篇更深入的文章《探究php底層運行機制》

http://www.myext.cn/Article/897.html

http://www.myext.cn/Article/920.html

php底層深度探索  http://blog.csdn.net/wanghao72214/category/510247.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章