Windows Cache Extension for PHP 是一種 PHP 加速器,用于提高在 Windows 和 Windows Server 上運(yùn)行的 PHP 應(yīng)用程序的速度。一旦 PHP 引擎啟用并加載了 Windows Cache Extension for PHP,PHP 應(yīng)用程序就可以利用該功能,而無需修改任何代碼。
一、Windows緩存擴(kuò)展類型
Windows 緩存擴(kuò)展包括 5 種不同類型的緩存。下面將介紹每種緩存類型的用途及其帶來的好處。
1、PHP 操作碼緩存
PHP 是一個腳本處理引擎,它讀取包含文本和/或 PHP 指令的輸入數(shù)據(jù)流,并生成另一個數(shù)據(jù)流,最常見的是 HTML 格式。這意味著在網(wǎng)絡(luò)服務(wù)器上,每次網(wǎng)絡(luò)客戶端請求 PHP 腳本時,PHP 引擎都會對其進(jìn)行讀取、解析、編譯和執(zhí)行。讀取、解析和編譯操作會給網(wǎng)絡(luò)服務(wù)器的 CPU 和文件系統(tǒng)帶來額外負(fù)擔(dān),從而影響 PHP 網(wǎng)絡(luò)應(yīng)用程序的整體性能。PHP 字節(jié)碼(操作碼)緩存用于將編譯后的腳本字節(jié)碼存儲在共享內(nèi)存中,以便 PHP 引擎在后續(xù)執(zhí)行同一腳本時重復(fù)使用。
Wincache 2.0.0 取消了對操作碼緩存的支持,所有希望使用操作碼緩存的用戶都應(yīng)使用 PHP 附帶的 OPcache 擴(kuò)展。
2、文件緩存
即使啟用了 PHP 操作碼緩存,PHP 引擎也必須訪問文件系統(tǒng)上的腳本文件。當(dāng) PHP 腳本存儲在遠(yuǎn)程 UNC 文件共享上時,文件操作會帶來很大的性能開銷。PHP 的 Windows 緩存擴(kuò)展包含一個文件緩存,用于在共享內(nèi)存中存儲 PHP 腳本文件的內(nèi)容,從而減少 PHP 引擎執(zhí)行的文件系統(tǒng)操作量。
3、解析文件路徑緩存
PHP 腳本經(jīng)常使用相對文件路徑來包含或操作文件。PHP 引擎必須將每個文件路徑規(guī)范化為絕對文件路徑。當(dāng) PHP 應(yīng)用程序使用許多 PHP 文件并通過相對路徑訪問這些文件時,解析路徑的操作可能會對應(yīng)用程序的性能產(chǎn)生負(fù)面影響。PHP 的 Windows 緩存擴(kuò)展提供了一個 “解析文件路徑 “緩存,用于存儲相對路徑和絕對文件路徑之間的映射,從而減少 PHP 引擎必須執(zhí)行的路徑解析次數(shù)。
4、用戶緩存(自 1.1.0 版起可用)
PHP 腳本可通過使用用戶緩存 API 來利用共享內(nèi)存緩存。PHP 對象和變量可以存儲在用戶緩存中,然后在后續(xù)請求中重復(fù)使用。這可用于提高 PHP 腳本的性能,并在多個 PHP 進(jìn)程中共享數(shù)據(jù)。
5、會話處理程序(自 1.1.0 版起可用)
WinCache 會話處理程序可用于將 PHP 會話數(shù)據(jù)存儲在共享內(nèi)存緩存中。這避免了讀寫會話數(shù)據(jù)時的文件系統(tǒng)操作,從而提高了在 PHP 會話中存儲大量數(shù)據(jù)時的性能。
二、安裝和配置
1、安裝要求
該擴(kuò)展目前僅支持以下配置:
Windows 操作系統(tǒng):
- 配備 IIS 5.1 和 ” FastCGI 擴(kuò)展 ” 的 Windows XP SP3;
- 配備 IIS 6.0 和 ” FastCGI 擴(kuò)展模塊 ” 的 Windows Server 2003;
- Windows Vista SP1,帶 IIS 7.0 和 FastCGI 模塊;
- Windows Server 2008,帶 IIS 7.0 和 FastCGI 模塊;
- Windows 7,帶 IIS 7.5 和 FastCGI 模塊;
- Windows Server 2008 R2,帶 IIS 7.5 和 FastCGI 模塊。
PHP:
- PHP 5.2.X,非線程安全構(gòu)建;
- PHP 5.3 X86,非線程安全 VC9 版本。
2、安裝
該擴(kuò)展有兩個軟件包:一個軟件包適用于 PHP 5.2.X,另一個軟件包適用于 PHP 5.3.X。
按照以下步驟安裝并啟用擴(kuò)展:
- 將軟件包解壓到某個臨時位置;
- 將文件復(fù)制到 PHP 擴(kuò)展文件夾中。通常這個文件夾被稱為 “ext”,與所有 PHP 二進(jìn)制文件位于同一文件夾中。例如:.php_wincache.dllC:\Program Files\PHP\ext;
- 使用文本編輯器打開 php.ini 文件,該文件通常與所有 PHP 二進(jìn)制文件位于同一文件夾中。例如:. C:\Program Files\PHP\php.ini;
- 在 php.ini 文件末尾添加以下一行:. extension = php_wincache.dll;
- 保存并關(guān)閉文件;
- 回收 IIS Application Pools for PHP 以接收配置更改。要檢查擴(kuò)展是否已啟用,請創(chuàng)建一個調(diào)用 phpinfo 函數(shù)的 PHP 代碼文件;
- 將該文件保存在使用 PHP 的 IIS 網(wǎng)站的根文件夾中,然后打開瀏覽器,向 http://localhost/phpinfo.php 提出請求。在返回的網(wǎng)頁中搜索名為 . 如果擴(kuò)展已啟用,則 phpinfo 輸出將列出 WinCache 提供的配置設(shè)置。
3、運(yùn)行時配置
- wincache.fcenabled bool:啟用或禁用文件緩存功能;
- wincache.fcenabledfilter string:定義一個以逗號分隔的 IIS 網(wǎng)站標(biāo)識符列表,在該列表中應(yīng)啟用或禁用文件緩存。此設(shè)置與 wincache.fcenabled 配合使用:如果 wincache.fcenabled 設(shè)置為 1,則 wincache.fcenabledfilter 中列出的網(wǎng)站將關(guān)閉文件緩存;如果 wincache.fcenabled 設(shè)置為 0,則 wincache.fcenabledfilter 中列出的網(wǎng)站將打開文件緩存;
- wincache.fcachesize int:定義分配給文件緩存的最大內(nèi)存大小(以兆字節(jié)為單位)。如果所有緩存文件的總大小超過了此設(shè)置中指定的值,那么大部分過期文件將從文件緩存中刪除;
- wincache.fcndetect bool:啟用或禁用文件更改通知檢測功能。如果支持文件更改通知,那么一旦文件系統(tǒng)中的相應(yīng)文件被修改,就會立即刷新操作碼和文件緩存條目。如果不支持文件更改通知,例如在使用網(wǎng)絡(luò)文件共享時,wincache 將以 wincache.chkinterval 指定的固定時間間隔輪詢文件更改;
- wincache.maxfilesize int:定義允許緩存的單個文件的最大大?。ㄇё止?jié))。如果文件大小超過指定值,則不會緩存該文件。此設(shè)置僅適用于文件緩存;
- wincache.ocenabled bool:從 2.0.0.0 起,該選項(xiàng)已被刪除,啟用或禁用操作碼緩存功能;
- wincache.ocenabledfilter :字符串從 2.0.0.0 起該選項(xiàng)已被刪除定義啟用或禁用操作碼緩存的 IIS 網(wǎng)站標(biāo)識符逗號分隔列表。此設(shè)置與 wincache.ocenabled 配合使用:如果 wincache.ocenabled 設(shè)置為 1,則 wincache.ocenabledfilter 中列出的網(wǎng)站將關(guān)閉運(yùn)算碼緩存;如果 wincache.ocenabled 設(shè)置為 0,則 wincache.ocenabledfilter 中列出的網(wǎng)站將打開運(yùn)算碼緩存;
- wincache.ocachesize int:從 2.0.0.0 起該選項(xiàng)已被刪除定義為操作碼緩存分配的最大內(nèi)存大小(以兆字節(jié)為單位)。如果緩存的操作碼大小超過了指定值,那么大部分過時的操作碼將從緩存中刪除。請注意,操作碼緩存大小必須至少是文件緩存大小的 3 倍。否則,操作碼緩存大小將自動增加;
- wincache.filecount int:定義擴(kuò)展需要緩存的文件數(shù)量,以便在啟動時分配適當(dāng)?shù)膬?nèi)存大小。如果文件數(shù)超過指定值,WinCache 將根據(jù)需要重新分配更多內(nèi)存;
- wincache.chkinterval int:定義擴(kuò)展檢查文件更改以刷新緩存的頻率(以秒為單位)。將其設(shè)置為 0 將禁止刷新緩存。除非 scavenger 刪除了該文件的緩存條目,或 IIS 應(yīng)用程序池被回收,或調(diào)用了 wincache_refresh_if_changed函數(shù),否則文件更改不會反映在緩存中;
- wincache.ttlmax int:定義未被使用的緩存條目的最長生存時間(秒)。將其設(shè)置為 0 將禁用緩存清道夫,因此在 IIS Worker 進(jìn)程的生命周期內(nèi),緩存條目永遠(yuǎn)不會從緩存中刪除;
- wincache.enablecli bool:定義 PHP 在命令行 (CLI) 模式下運(yùn)行時是否啟用緩存;
- wincache.ignorelist string:定義擴(kuò)展不應(yīng)緩存的文件列表。文件列表僅使用文件名指定,并用管道符號”|”分隔;
wincache.ignorelist 示例:
wincache.ignorelist = "index.php|misc.php|admin.php"
- wincache.namesalt string:定義一個字符串,用于命名存儲在共享內(nèi)存中的特定擴(kuò)展對象。這樣做是為了避免 IIS 工作進(jìn)程中的其他應(yīng)用程序試圖訪問共享內(nèi)存時可能造成的沖突。命名字符串的長度不能超過 8 個字符;
- wincache.ucenabled bool:啟用或禁用用戶緩存功能;
- wincache.ucachesize int:定義分配給用戶緩存的最大內(nèi)存容量(以兆字節(jié)為單位)。如果存儲在用戶緩存中的變量的總大小超過指定值,那么最陳舊的變量將從緩存中刪除;
- wincache.scachesize int:定義為會話緩存分配的最大內(nèi)存大小(以兆字節(jié)為單位)。如果會話緩存中存儲的數(shù)據(jù)總大小超過指定值,則會從緩存中刪除最陳舊的數(shù)據(jù);
- wincache.rerouteini string:自 1.3.7 起,該選項(xiàng)已被刪除;
- wincache.reroute_enabled:指定 reroute.ini 文件的絕對路徑或相關(guān)路徑。該文件包含 PHP 函數(shù)列表,其實(shí)現(xiàn)應(yīng)被 WinCache 函數(shù)等效替換。如果指定的是相對路徑,則假定該路徑相對于 php-cgi.exe 文件的位置;
- wincache.reroute_enabled bool:啟用或禁用通過文件緩存重路由某些文件 I/O 功能;
- wincache.srwlocks bool:從 2.0.0.0 起,該選項(xiàng)已被刪除。啟用或禁用共享讀寫器鎖。禁用該選項(xiàng)有助于解決 WinCache 中的死鎖問題;
- wincache.filemapdir :字符串指定一個目錄的絕對路徑,WinCache 將在該目錄中存儲用于共享內(nèi)存段的臨時文件。該目錄必須位于本地計算機(jī)上,而不是網(wǎng)絡(luò)文件系統(tǒng)上。如果未指定目錄,WinCache 將為所有共享內(nèi)存段使用 Windows 系統(tǒng)頁面文件。
4、WinCache數(shù)據(jù)統(tǒng)計腳本
WinCache 的安裝包中包含一個 PHP 腳本,用于獲取緩存信息和統(tǒng)計數(shù)據(jù)。
如果 WinCache 擴(kuò)展是通過 Microsoft 網(wǎng)絡(luò)平臺安裝程序安裝的,則該腳本位于 .NET Framework 3.0 中。在 64 位版本的 Windows Server 操作系統(tǒng)中,該腳本位于 。 如果擴(kuò)展是手動安裝的,則該腳本將位于提取安裝包內(nèi)容的同一文件夾中。
%SystemDrive%\Program Files\IIS\Windows Cache for PHP\%SystemDrive%\Program Files (x86)\IIS\Windows Cache for PHPwincache.php
使用時,將其復(fù)制到網(wǎng)站的根文件夾或任何子文件夾中。要保護(hù)腳本,請?jiān)谌魏挝谋揪庉嬈髦写蜷_它,并替換 USERNAME 和 PASSWORD 常量的值。
wincache.php 的驗(yàn)證配置示例:
<?php /** * ======================== CONFIGURATION SETTINGS ============================== * If you do not want to use authentication for this page, set USE_AUTHENTICATION to 0. * If you use authentication then replace the default password. */ define('USE_AUTHENTICATION', 1); define('USERNAME', 'wincache'); define('PASSWORD', 'wincache'); /** * The Basic PHP authentication will work only when IIS is configured to support * Anonymous Authentication' and nothing else. If IIS is configured to support/use * any other kind of authentication like Basic/Negotiate/Digest etc, this will not work. * In that case use the array below to define the names of users in your * domain/network/workgroup which you want to grant access to. */ $user_allowed = array('DOMAIN\user1', 'DOMAIN\user2', 'DOMAIN\user3'); /** * If the array contains string 'all', then all the users authenticated by IIS * will have access to the page. Uncomment the below line and comment above line * to grant access to all users who gets authenticated by IIS. */ /* $user_allowed = array('all'); */ /** ===================== END OF CONFIGURATION SETTINGS ========================== */ ?>
5、WinCache會話處理程序
WinCache 會話處理程序(自 WinCache 1.1.0 起可用)可用于配置 PHP 將會話數(shù)據(jù)存儲在共享內(nèi)存會話緩存中。使用共享內(nèi)存而不是默認(rèn)的文件會話存儲,有助于提高在會話對象中存儲大量數(shù)據(jù)的 PHP 應(yīng)用程序的性能。Wincache 會話緩存使用文件支持的共享內(nèi)存,可確保會話數(shù)據(jù)在 IIS 應(yīng)用程序池回收時不會丟失。
要配置 PHP 使用 WinCache 會話處理程序,請將 php.ini 設(shè)置 session.save_handler 設(shè)為 wincache。默認(rèn)情況下,Windows 臨時文件位置用于存儲會話數(shù)據(jù)。要更改會話文件的位置,請使用 session.save_path 指令。
啟用 WinCache 會話處理程序示例:
session.save_handler = wincache session.save_path = C:\inetpub\temp\session\
6、WinCache功能重路由
WinCache 函數(shù)重路由(自 WinCache 1.2.0 起可用,自 WinCache 1.3.7.0 起已移除)可用于將 PHP 內(nèi)置函數(shù)替換為針對特定目的進(jìn)行了優(yōu)化的等效函數(shù)。WinCache 擴(kuò)展包括經(jīng)過 Windows 優(yōu)化的 PHP 文件函數(shù)實(shí)現(xiàn),當(dāng) PHP 需要訪問網(wǎng)絡(luò)共享上的文件時,可以提高 PHP 應(yīng)用程序的性能。優(yōu)化實(shí)現(xiàn)適用于以下函數(shù):
- file_exists
- file_get_contents
- readfile
- is_readable
- is_writable
- is_dir
- realpath
- filesize
要配置 WinCache 以使用 reroutes 功能,請使用 WinCache 安裝包中的 reroute.ini 文件。將該文件復(fù)制到 php.ini 文件所在的同一目錄下。然后在 php.ini 中添加 wincache.rerouteini 設(shè)置,并指定 reroute.ini 文件的絕對路徑或相對路徑。
啟用 WinCache 重路由功能示例:
wincache.rerouteini = C:\PHP\reroute.ini
注意: 如果啟用了 WinCache 功能 reroutes,建議增加 WinCache 文件緩存大小。這可以通過使用 wincache.fcachesize 設(shè)置來實(shí)現(xiàn)。
reroute.ini 文件包含本地 PHP 函數(shù)與 WinCache 中對應(yīng)函數(shù)之間的映射。文件中的每一行都使用以下語法定義映射:
<PHP function name>:[<number of function parameters>]=<wincache function name>
在以下示例中,只有當(dāng)傳遞給函數(shù)的參數(shù)數(shù)量小于或等于 2 時,對 PHP 函數(shù) file_get_contents() 的調(diào)用才會被替換為對 wincache_file_get_contents() 的調(diào)用。 當(dāng)替換函數(shù)無法處理所有函數(shù)參數(shù)時,指定參數(shù)數(shù)量非常有用。
Reroute.ini 文件內(nèi)容示例:
[FunctionRerouteList] file_exists=wincache_file_exists file_get_contents:2=wincache_file_get_contents readfile:2=wincache_readfile is_readable=wincache_is_readable is_writable=wincache_is_writable is_writeable=wincache_is_writable is_file=wincache_is_file is_dir=wincache_is_dir realpath=wincache_realpath filesize=wincache_filesize
三、WinCache函數(shù)
- wincache_fcache_fileinfo – 讀取文件緩存中緩存的文件信息;
- wincache_fcache_meinfo – 讀取有關(guān)文件緩存內(nèi)存使用情況的信息;
- wincache_lock – 獲取指定鍵的獨(dú)占鎖;
- wincache_ocache_fileinfo – 讀取操作碼緩存中緩存的文件信息;
- wincache_ocache_meminfo – 讀取有關(guān)操作碼緩存內(nèi)存使用情況的信息;
- wincache_refresh_if_changed – 刷新緩存文件的緩存條目;
- wincache_rplist_fileinfo – 讀取有關(guān)解析文件路徑緩存的信息;
- wincache_rplist_meminfo – 讀取解析文件路徑緩存的內(nèi)存使用信息;
- wincache_scache_info – 讀取會話緩存中緩存的文件信息;
- wincache_scache_meminfo – 讀取有關(guān)會話緩存內(nèi)存使用情況的信息;
- wincache_ucache_add – 僅當(dāng)緩存中還不存在變量時,在用戶緩存中添加變量;
- wincache_ucache_cas – 將變量與舊值進(jìn)行比較并賦予新值;
- wincache_ucache_clear – 刪除用戶緩存中的全部內(nèi)容;
- wincache_ucache_dec – 減少與鍵相關(guān)聯(lián)的值;
- wincache_ucache_delete – 從用戶緩存中刪除變量;
- wincache_ucache_exists – 檢查用戶緩存中是否存在變量;
- wincache_ucache_get – 獲取存儲在用戶緩存中的變量;
- wincache_ucache_inc – 增加與鍵相關(guān)聯(lián)的值;
- wincache_ucache_info – 讀取存儲在用戶緩存中的數(shù)據(jù)信息;
- wincache_ucache_meminfo – 讀取有關(guān)用戶緩存內(nèi)存使用情況的信息;
- wincache_ucache_set – 在用戶緩存中添加變量,如果緩存中已存在變量,則覆蓋該變量;
- wincache_unlock – 釋放給定鍵的獨(dú)占鎖。
四、為Windows構(gòu)建
1、先決條件
- PHP 源代碼;
- PHP 構(gòu)建環(huán)境;
- WinCache 源代碼。
2、編譯和構(gòu)建
以下步驟介紹了如何在 Windows 操作系統(tǒng)上編譯和構(gòu)建 WinCache:
(1)打開用于編譯 PHP 的命令提示符.
(2)轉(zhuǎn)到 PHP 源所在的根目錄
(3)運(yùn)行命令
cscript.exe win32\build\buildconf.js
(4)運(yùn)行命令
configure.bat --help
輸出結(jié)果將包含一個新標(biāo)志–enable-wincache。
(5)運(yùn)行命令
configure.js [all options used to build PHP] --enable-wincache
–enable-wincache是唯一需要的額外選項(xiàng),以確保正確構(gòu)建 WinCache 擴(kuò)展。該選項(xiàng)將構(gòu)建 WinCache 并將其與 PHP dll 進(jìn)行靜態(tài)鏈接。要將 WinCache 擴(kuò)展作為獨(dú)立的 DLL 生成,請使用 –enable-wincache=shared 選項(xiàng)。
(6)運(yùn)行命令
nmake
3、驗(yàn)證編譯
以下步驟描述了如何驗(yàn)證 WinCache 的構(gòu)建是否正確:
1、轉(zhuǎn)到構(gòu)建 PHP 二進(jìn)制文件的文件夾
2、運(yùn)行命令
php.exe -n -d extension=php_wincache.dll -re wincache
如果 WinCache 已正確構(gòu)建,該命令的輸出將列出 WinCache 支持的 INI 指令和函數(shù)。