thread-safety PHP & no thread-safety PHP 版本選擇

不同的web服務器處理高併發的HTTP請求的方式是不同的。一個相對流行的方式是使用線程處理請求——web服務器爲每一個請求創建/銷燬一個線程。Apache HTTP web服務器使用worker MPM支持多線程模型處理請求。Apache也支持使用prefork MPM,用進程來處理併發的請求——-服務器爲每個請求創建/銷燬一個進程。worker MPMprefork MPM可以理解爲Apache的工作方式。

 

也有不同的用於處理請求的併發模型(例如異步IO),不過就回答thread-safety PHP還是no thread-safety PHP版本選擇來說,我們暫時只考慮上面提到的兩種模型,以Apache HTTP服務器作爲例子。

 

PHP本身是無法響應HTTP請求的,由web服務器響應請求。所以我們要做的就是配置web服務器轉發請求到PHP那裏進行加工,然後收到加工後的結果並返還回給用戶。鏈接web服務器和PHP的方式有多種 。對於Apache HTTP服務器,最流行的方式是mod_phpPHP作爲Apache的模塊,可以使PHP正確的加載到web服務器中。

也有其它的方式鏈接PHPApache和其它的web服務器,但是mod_PHP是較流行的用法。

我們可能並沒有瞭解太多的細節,因爲linux發行版已經爲們準備好了每件事情。

回到選用PHP版本問題上。mod_php可以正確的加載到Apache之中,如果Apache打算使用Worker MPM處理併發請求,PHP必須要能夠操作多線程的環境----意味着PHP必須是thread-safety的才能夠和Apache良好的協作。

這時候,你可能會想,好吧,我選用多線程的web服務器加載PHP,那麼我必須選擇thread-safety PHP。然而實際上,thread-safety PHP是廣受爭議的,當你選用它的時候,你最好真正的知道你到底在做什麼。

當然,並不是不可以使用多線程的環境。如果你正在使用NginxLighthttpd,你應該就不會想裝載PHPweb服務器中,而是使用FastCGI或者一些等價的模型。

想看一些你的網站目前應用的是什麼類型的,在服務器的目錄下放一個包含<?PHP phpinfo();?>的文件。然後查找API條目,在那裏會提到一些類似於CGI/FastCGI或者Apache 2.0 Handler的東西。

 

最後,是選擇thread-safety還是no-thread-safetyPHP呢?我並沒有科學的答案,但是我猜測no-thread-safety的版本更快和更少的問題,不然的話,官方應該只提供thread-safety版本的了,也不會困擾我們讓我們難以選擇了。

 

總結:

  1. Thread-safety 版本的PHP廣受爭議。

  2. Web服務器多線程工作模型可以使用其它的方案代替。

  3. 選擇no-threads-safety版本的PHP應該會快一些和更少的問題(這只是猜測)


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