理解PHP的執行機制

2022-09-12 00:06:29 字數 1595 閱讀 3483

php是一種純解釋型在服務端執行的可以內嵌html的指令碼語言,尤其適合開發web應用程式。

請求乙個 php 指令碼時,php 會讀取該指令碼,並將其編譯為 zend 操作碼,這是要執行的**的一種二進位制表示形式。隨後,此操作碼由 php 執行並丟棄。 php指令碼在每次被解釋時進行初始化,在解釋完畢後終止執行。這種執行是互相獨立的,每一次請求都會建立乙個單獨的程序或執行緒,來解釋相應的頁面檔案。頁面建立的變數和其他物件,都只在當前的頁面內部可見,無法跨越頁面訪問。在終止執行後,頁面中申請的、沒有被**顯式釋放的外部資源,包括記憶體、資料庫連線、檔案控制代碼、socket連線等,都會被強行釋放。也就是說,php無法在語言級別上實現直接訪問跨越頁面的變數,也無法建立駐留記憶體的物件。

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

一是物件的緩衝。眾所周知,很多設計模式都依賴於物件的緩衝機制,建立和銷毀物件是很費時間的,因為建立乙個物件要獲取記憶體資源或者其它更多資源,對於需要頻繁應付大量併發的服務端軟體更是如此。因此,物件緩衝的缺失,理論上會極大地降低速度。應盡可能減少建立和銷毀物件的次數來提高服務程式的效率,由於 php目前還不支援多執行緒,也就無法像j**a一樣通過執行緒池排程來彌補這一缺陷;但可以使用第三方軟體如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)是個不錯的選擇。

PHP的執行機制

php和python ruby的執行機制有乙個本質區別 php是每次http請求過來以後,初始化全部資源 例如建立資料庫鏈結 載入系統類庫,建立快取等等 處理完畢,釋放全部資源,這不像python ruby之類帶有gc的指令碼語言,python ruby是初次啟動的時候初始化資源,隨後的請求就不必再...

JavaScript執行機制初步理解

參考 settimeout 3000 console.log 執行console settimeout是非同步的,應該先執行console.log這個同步任務。執行結果 settimeout 3000 sleep 10000000 上述 執行過程 答案是不會的,settimeout fn,0 的含義...

js 理解new的執行機制

先上段 1 function people name 45 people.prototype.sayname function 8 9var man1 new people xiaos 10console.log man1.name 11 man1.sayname 接下來我們分析下上述 1.1 3行...