天天看點

PHP線程安全和非線程安全的差別

windows版的php從版本5.2.1開始有thread safe。這兩者不同在于何處?到底應該用哪種?這裡做一個簡單的介紹。

從2000年10月20日釋出的第一個windows版的php3.0.17開始的都是線程安全的版本,這是由于與linux/unix系統是采用 多程序的工作方式不同的是windows系統是采用多線程的工作方式。如果在iis下以cgi方式運作php會非常慢,這是由于cgi模式是建立在多程序 的基礎之上的,而非多線程。一般我們會把php配置成以isapi的方式來運作,isapi是多線程的方式,這樣就快多了。但存在一個問題,很多常用的 php擴充是以linux/unix的多程序思想來開發的,這些擴充在isapi的方式運作時就會出錯搞垮iis。而用線程安全版本的話頂多隻是搞跨某個 線程,而不會影響到整個iis的安全。

當然在iis下cgi模式才是 php運作的最安全方式,但cgi模式對于每個http請求都需要重新加載和解除安裝整個php環境,其消耗是巨大的。為了兼顧iis下php的效率和安全, 有人給出了fastcgi的解決方案。fastcgi可以讓php的程序重複利用而不是每一個新的請求就重開一個程序。同時fastcgi也可以允許幾個 程序同時執行。這樣既解決了cgi程序模式消耗太大的問題,又利用上了cgi程序模式不存線上程安全問題的優勢。

是以,如果是使用isapi的方式來運作php就必須用thread safe(線程安全)的版本;而用fastcgi模式運作php的話就沒有必要用線程安全檢查了,用none thread safe(nts,非線程安全)的版本能夠更好的提高效率。

【德問社群】 http://www.dewen.org/q/138

下載下傳php安裝檔案時,我看到有兩種不同的二進制檔案,像是非線程安全(non thread safe)和線程安全(thread safe),比如該頁面所列:http://windows.php.net/download/。這個是什麼意思,之間有什麼差別?
這個主要是針對web server 而言,在windows環境下,如果你使用的web server 是apchae 或者 iis 7以下版本,則應該選擇線程安全的安裝檔案,而如果你使用fast-cgi模式時,可以選擇非線程安全,因為 web sever 本身能保證線程安全。 當然還有二進制檔案編譯時所使用的編譯器:vc9 (vs系列) vc6(gcc)
如樓上所言,是針對web server的,部分web server在處理應用請求的時候是用多線程而非多程序的方式處理,線程方式因為涉及到共享寄存器和記憶體,是以很容易出錯,這個時候程式就需要花一些額外的經曆去處理寄存器中的資料一緻性,即保證線程安全。 是以是否采用線程安全主要看你的web server所采用的php請求處理方式,如果是多線程處理,那麼請選擇線程安全的,否則選擇非線程安全的,如樓上所說fast-cgi方式可選擇非線程安全的