不同的web服務器處理高併發的HTTP請求的方式是不同的。一個相對流行的方式是使用線程處理請求——web服務器爲每一個請求創建/銷燬一個線程。Apache HTTP web服務器使用worker MPM支持多線程模型處理請求。Apache也支持使用prefork MPM,用進程來處理併發的請求——-服務器爲每個請求創建/銷燬一個進程。worker MPM和prefork MPM可以理解爲Apache的工作方式。
也有不同的用於處理請求的併發模型(例如異步IO),不過就回答thread-safety PHP還是no thread-safety PHP版本選擇來說,我們暫時只考慮上面提到的兩種模型,以Apache HTTP服務器作爲例子。
PHP本身是無法響應HTTP請求的,由web服務器響應請求。所以我們要做的就是配置web服務器轉發請求到PHP那裏進行加工,然後收到加工後的結果並返還回給用戶。鏈接web服務器和PHP的方式有多種 。對於Apache HTTP服務器,最流行的方式是”mod_php”,PHP作爲Apache的模塊,可以使PHP正確的加載到web服務器中。
也有其它的方式鏈接PHP和Apache和其它的web服務器,但是mod_PHP是較流行的用法。
我們可能並沒有瞭解太多的細節,因爲linux發行版已經爲們準備好了每件事情。
回到選用PHP版本問題上。mod_php可以正確的加載到Apache之中,如果Apache打算使用Worker MPM處理併發請求,PHP必須要能夠操作多線程的環境----意味着PHP必須是thread-safety的才能夠和Apache良好的協作。
這時候,你可能會想,好吧,我選用多線程的web服務器加載PHP,那麼我必須選擇thread-safety PHP。然而實際上,thread-safety PHP是廣受爭議的,當你選用它的時候,你最好真正的知道你到底在做什麼。
當然,並不是不可以使用多線程的環境。如果你正在使用Nginx或Lighthttpd,你應該就不會想裝載PHP到web服務器中,而是使用FastCGI或者一些等價的模型。
想看一些你的網站目前應用的是什麼類型的,在服務器的目錄下放一個包含<?PHP phpinfo();?>的文件。然後查找API條目,在那裏會提到一些類似於CGI/FastCGI或者Apache 2.0 Handler的東西。
最後,是選擇thread-safety還是no-thread-safety的PHP呢?我並沒有科學的答案,但是我猜測no-thread-safety的版本更快和更少的問題,不然的話,官方應該只提供thread-safety版本的了,也不會困擾我們讓我們難以選擇了。
總結:
Thread-safety 版本的PHP廣受爭議。
Web服務器多線程工作模型可以使用其它的方案代替。
選擇no-threads-safety版本的PHP應該會快一些和更少的問題(這只是猜測)