2014-07-17 77 views
6

最近我決定回到PHP,做一些比簡單的登錄頁面更復雜的東西。 3年來,我一直在使用Java/JavaEE進行編程,並對Java應用程序的體系結構有很好的理解。基本上,運行編譯代碼的虛擬機(簡單的OS進程)稱爲字節碼。一個簡單的Java Web服務器基本上是一個Java應用程序,它在提供的TCP端口上監聽Http請求並作出響應,當然這比它更復雜,但這是它的初始工作。PHP如何工作,它的體系結構是什麼?

現在,PHP呢?它是如何工作的 ?簡言之,它的架構是什麼。

我對這個問題進行了搜索,但在90%的文章中解釋瞭如何使用PHP實現和構建Web應用程序,這不是我正在尋找的。

+2

幾乎是虛擬機和編譯的...解釋。 Web服務器體系結構取決於Web服務器,這裏不是語言特定的 –

+1

http://stackoverflow.com/questions/2720488/how-exactly-is-a-php-script-executed – cerkiewny

+2

有點偏離主題,但如果你從PHP開始,我會建議你[phptherightway](http://www.phptherightway.com/)作爲一個非常有用的資源,以便如何正確開始。 – mTorres

回答

14

Java Web服務器和PHP最大的區別在於PHP沒有自己的內置Web服務器。 (好吧,新版本可以,但應該只用於測試,它不是一個生產就緒的Web服務器。)PHP本身基本上是一個可執行文件,它讀取PHP代碼的源代碼文件並解釋/執行寫入的命令文件。而已。簡而言之,這就是PHP的架構。

該可執行文件支持用戶級PHP代碼可以調用的默認API,並且可以添加擴展以提供更多的API。這些擴展通常用C語言編寫,並在安裝時與PHP可執行文件一起編譯。一些擴展只能通過重新編譯帶附加標誌的PHP來添加,其他擴展只能通過PHP安裝進行編譯並在事後通過配置文件激活。 PHP提供了PEAR和PECL方面的項目,以標準化並簡化這種事後安裝。 Userland PHP代碼通常還會包含額外的第三方庫,只需使用PHP代碼編寫。 C擴展的優勢在於它們的執行速度和低級系統訪問,用戶級代碼庫的優勢在於它們的微不足道。如果您正在管理您自己的PHP安裝,那麼添加新的PHP擴展通常很簡單;然而,在非常受歡迎的共享主機模型中,主機想要安裝的內容與開發人員需要的內容之間經常存在緊張關係。

實際上PHP編寫的Web服務的第三方網站的服務器上運行,很多時候的Apache,它處理任何傳入的請求,並調用與給定的要求PHP源代碼文件作爲參數PHP解釋器,然後提供的任何輸出處理返回到HTTP客戶端。這也意味着沒有持續運行的PHP進程始終處於持久狀態,就像Java通常所做的那樣,但是每個請求都是通過啓動然後拆除新的PHP實例來處理的。

雖然Java只是將持久數據保存在內存中,但PHP中請求之間的數據持久性通過許多方法處理,如memcache,會話,數據庫,文件等;取決於具體情況的具體需要。 PHP確實有操作碼緩存插件,像Java字節碼這樣的工作,簡單地說,PHP不必每次執行相同的文件就重複相同的分析和編譯過程。

請記住,編寫一個像Java一樣運行的持久性PHP程序是完全可行的,它不是PHP的默認工作方式。就我個人而言,我非常喜歡爲Gearman或ZMQ上持久運行的特定任務編寫工作人員,並且在Web服務器上運行一些臨時腳本作爲「前端」,根據需要委派工作給這些工作人員。

如果這聽起來像一個典型的PHP應用程序更多的是粘在一起的幾個不同組件的積累,你會是正確的。除了像RDBMS服務器這樣的外部產品外,Java相當獨立。另一方面,PHP通常傾向於依賴一堆第三方產品;從某種意義上說,它可以發揮其優勢,因爲您可以針對特定任務使用同類最佳產品,但還需要處理不同系統的更多開銷。

+0

+1爲帶來gearman和zmq(我喜歡rabbitmq作爲替代我自己)到建築圖片 –

+0

此外,[看看如何可以綁定PHP解釋器與網絡服務器](http://coolpandaca.wordpress.com/2012/03/20/Apache的MPM-工人prefork的-mod_php的-mod_fcgid-的mod_fastcgi-PHP-FPM-和-nginx的/)。有幾個選項... – mTorres

6

這是怎麼做PHP工作:

(在互聯網上最好的之一)

PHP internals

+2

哇人好圖片我喜歡架構的照片:) – Adelin

相關問題