企業軟體的乙個關鍵元素就是互操作性,它可以讓軟體與其他平台交換資訊。大家都認為php在這方面表現欠佳,因為它的ws-*支援相對來說比較新且功能較少,成熟度不高。關於這點我們從未手動開啟過php的相關程序,它是隨著apache的啟動而執行的。php通過mod_php5.so模組和apache相連(具體說來是sapi,即伺服器應用程式程式設計介面)。
php總共有三個模組:核心、zend引擎、以及擴充套件層。
php核心用來處理請求、檔案流、錯誤處理等相關操作;
zend引擎(ze)用以將原始檔轉換成機器語言,然後在虛擬機器上執行它;
擴充套件層是一組函式、類庫和流,php使用它們來執行一些特定的操作。
比如,我們需要mysql擴充套件來連線mysql資料庫; 當ze執行程式時可能會需要連線若干擴充套件,這時ze將控制權交給擴充套件,等處理完特定任務後再返還;最後,ze將程式執行結果返回給php核心,它再將結果傳送給sapi層,最終輸出到瀏覽器上。
深入**:
真正的內部執行過程沒有這麼簡單。以上過程只是個簡略版,讓我們再深入挖掘一下,看看幕後還發生了些什麼。
apache啟動後,php解釋程式也隨之啟動。php的啟動過程有兩步:
第一步是初始化一些環境變數,這將在整個sapi生命週期中發生作用;
第二步是生成只針對當前請求的一些變數設定。
php啟動第一步
不清楚什麼第一第二步是什麼?別擔心,我們接下來詳細討論一下。讓我們先看看第一步,也是最主要的一步。要記住的是,第一步的操作在任何請求到達之前就發生了。
啟動apache後,php解釋程式也隨之啟動。php呼叫各個擴充套件的minit方法,從而使這些擴充套件切換到可用狀態。看看php.ini檔案裡開啟了哪些擴充套件吧。 minit的意思是「模組初始化」。各個模組都定義了一組函式、類庫等用以處理其他請求。
乙個典型的minit方法如下:
php_minit_function(extension_name)
php啟動第二步php關閉第一步
如同php啟動一樣,php的關閉也分兩步。一旦頁面執行完畢(無論是執行到了檔案末尾還是用exit或die函式中止),php就會啟動清理程式。它會按順序呼叫各個模組的rshutdown方法。 rshutdown用以清除程式執行時產生的符號表,也就是對每個變數呼叫unset函式。
乙個典型的rshutdown方法如下:
php_rshutdown_function(extension_name)
php關閉第二步
最後,所有的請求都已處理完畢,sapi也準備關閉了,php開始執行第二步:php呼叫每個擴充套件的mshutdown方法,這是各個模組最後一次釋放記憶體的機會。
乙個典型的rshutdown方法如下:
php_mshutdown_function(extension_name)
這樣,整個php生命週期就結束了。要注意的是,只有在伺服器沒有請求的情況下才會執行「啟動第一步」和「關閉第二步」。
企業級開發的思考
曾經自己一直覺得企業級開發是神聖的,是不容質疑的。雖然有時候自己也認可 多大屁股穿多大褲衩 的道理,可是那種重量級的開發模式在自己心目中占領的位置一直是不容侵犯的。直到近期公司打算要做個東西的時候才發現企業級真的非常重,重到90 以上的情況用不到。之前考慮過ejb和spring。自己一直覺得僅僅有e...
物件導向在企業級開發中的應用
控制層 將所接受的使用者資料傳入業務層並且接收業務曾傳回的資料給系統頁面顯示。業務層 對控制層傳入的資料進行判斷以及業務處理並將資料層返回的資料傳給控制層。資料層 接入資料庫執行查詢等功能,並且將查詢的結果返回給服務層 下面將以簡單的分層操作講解crm客戶關係管理系統 usercontroller層...
關於Docker的企業級應用
難怪docker正在迅速發展。docker,乙個開源專案。僅僅兩年,docker價值近10億美元,最近獲得了9500萬美元的資金。令人激動的是,我們看到有這麼多開發者對這個專案的熱情。然而,我將在下面討論企業使用docker本身是不夠的。許多企業it團隊解決這兩個問題 首先,開發者和運維者在優先順序...