|
|
|
|
|
因為一直用win2003+IIS6.0+PHP的環(huán)境,所以搭建PHP自認為非常熟悉了,但是最近在搭建win2012+IIS8.5+PHP的環(huán)境時,我遇到了一些問題,經(jīng)過4個小時的折騰,終于搞定了,本文記錄一些經(jīng)驗,可能不少朋友也會遇到與我相同的問題。
win2012安裝PHP,一些版本不能用
一開始我使用的PHP版本是 PHP-5.2.4-Win32,參照win10手動安裝PHP的方法,很快就安裝完畢,并且測試PHP程序運行成功,注意,此時沒有用到php.ini
這個文件。但當我要啟用某些擴展功能時,比如extension=php_curl.dll
,要用到了php.ini
,并把該文件復制到C:\Windows
后,運行PHP文件竟然報錯:500內(nèi)部服務器錯誤。這讓我知道,以前win2003+IIS6.0+PHP的搭建方法,在win2012系統(tǒng)不適用了!
是不是PHP版本太低了?我?guī)е@個疑問,下載了 php-5.3.29-nts-Win32-VC9-x86,重新手動配置PHP環(huán)境,沒用到php.ini
時,測試PHP程序運行成功。之后啟用某擴展功能,用到了php.ini
,并把該文件復制到C:\Windows
后,再次運行PHP文件,不再報錯!如此看來,真是PHP版本問題,要用 php5.3 以上的版本才行。
我還發(fā)現(xiàn),與win2003配置PHP環(huán)境不同,在win2012系統(tǒng)配置PHP,若使用curl擴展(其他擴展可能也一樣),則修改 php.ini
,修改完重啟IIS立即生效了,不用再把php.ini
文件復制到 C:\WINDOWS\
,也不要復制與擴展相關(guān)的文件如 libeay32.dll
和 ssleay32.dll
到 C:\WINDOWS\SysWOW64\
。
注意問題
安裝配置好 php-5.3.29-nts-Win32-VC9-x86 后,還需要在服務器安裝VC9,VC9是指Microsoft Visual C++ 9.0 32位,是安裝 Visual C++庫的運行時組件,使用戶能夠在計算機上運行使用Visual C++開發(fā)的應用程序,必須安裝了之后才能正常運行。
如果你安裝的PHP是其他版本,如 php-7.4.33-nts-Win32-VC15-x86,那么配置后你還必須安裝VC15,PHP才能正常運行。
總之是看PHP的文件名決定所須安裝的是哪個VC版本庫組件。
PHP版本有很多,如:
php-5.3.29-nts-win32-VC9-x86.msi
php-5.3.29-nts-Win32-VC9-x86.zip
php-5.3.29-src.zip
php-5.3.29-win32-VC9-x86.msi
php-5.3.29-Win32-VC9-x86.zip
在搭建win2012+IIS8.5+PHP環(huán)境時,只能選擇非線程安全的版本,即是文件名含“nts”的版本。
.msi是安裝版,src.zip是源碼包。我們都不使用,其他2個版本的區(qū)別是:
php-5.3.29-nts-Win32-VC9-x86.zip ,nts為Non Thread Safe非線程安全的版本。
php-5.3.29-Win32-VC9-x86.zip,這個為線程安全的版本。
同時PHP還有其他的版本,即x64的版本,但是x64版本是實驗性質(zhì)的,所以可以無視,直接使用x86版。
至于 Thead Safe(線程安全) 和 Non Thead Safe(非線程安全) ,由于IIS配置PHP時,使用的是FastCGI模塊,而此模塊是單線程執(zhí)行的,因而不需要線程安全版本。
TS(線程安全)和NTS(非線程安全)之分
Windows版的PHP從版本5.2.1開始有Thread Safe(線程安全)和None Thread Safe(NTS,非線程安全)之分,這兩者不同在于何處?到底應該用哪種?這里做一個簡單的介紹。
從2000年10月20日發(fā)布的第一個Windows版的PHP3.0.17開始的都是線程安全的版本,這是由于與Linux/Unix系統(tǒng)是采用多進程的工作方式不同的是Windows系統(tǒng)是采用多線程的工作方式。如果在IIS下以CGI方式運行PHP會非常慢,這是由于CGI模式是建立在多進程的基礎(chǔ)之上的,而非多線程。
一般我們會把PHP配置成以ISAPI的方式來運行,ISAPI是多線程的方式,這樣就快多了。但存在一個問題,很多常用的PHP擴展是以Linux/Unix的多進程思想來開發(fā)的,這些擴展在ISAPI的方式運行時就會出錯搞垮IIS。因此在IIS下CGI模式才是PHP運行的最安全方式,但CGI模式對于每個HTTP請求都需要重新加載和卸載整個PHP環(huán)境,其消耗是巨大的。
為了兼顧IIS下PHP的效率和安全,微軟給出了FastCGI的解決方案。FastCGI可以讓PHP的進程重復利用而不是每一個新的請求就重開一個進程。同時FastCGI也可以允許幾個進程同時執(zhí)行。這樣既解決了CGI進程模式消耗太大的問題,又利用上了CGI進程模式不存在線程安全問題的優(yōu)勢。
因此,如果是使用ISAPI的方式來運行PHP就必須用Thread Safe(線程安全)的版本;而用FastCGI模式運行PHP的話就沒有必要用線程安全檢查了,用None Thread Safe(NTS,非線程安全)的版本能夠更好的提高效率。
PHP官方上關(guān)于widows的版本有4個:VC9 x86 Non Thread Safe,VC9 x86 Thread Safe,VC6 x86 Non Thread Safe,VC6 x86 Thread Safe;那么有什么區(qū)別呢?
PHP是用C語言開發(fā)的所以依賴VC庫運行。
Visual C++ 2003 運行庫(VC7)
Visual C++ 2005 運行庫(VC8)
Visual C++ 2008 運行庫(VC9)
Visual C++ 2010 運行庫(VC10)
Visual C++ 2012 運行庫(VC11)
Visual C++ 2013 運行庫(VC12)
只有安裝了相應的運行庫才能運行PHP,如php5.5要求VC11的安裝。
PHP有2中運行方式:ISAPI和FastCGI。
ISAPI執(zhí)行方式是以DLL動態(tài)庫的形式使用,可以在被用戶請求后執(zhí)行,在處理完一個用戶請求后不會馬上消失,所以需要進行線程安全檢查,這樣來提高程序的執(zhí)行效率,所以如果是以ISAPI來執(zhí)行PHP,建議選擇Thread Safe版本;
而FastCGI執(zhí)行方式是以單一線程來執(zhí)行操作,所以不需要進行線程的安全檢查,除去線程安全檢查的防護反而可以提高執(zhí)行效率,所以,如果是以FastCGI來執(zhí)行PHP,建議選擇Non Thread Safe版本。
對于apache服務器來說一般選擇isapi方式,而對于nginx服務器則選擇FastCGI方式。
相關(guān)文章