Windows Cache Extension for PHP 是一种 PHP 加速器,用于提高在 Windows 和 Windows Server 上运行的 PHP 应用程序的速度。一旦 PHP 引擎启用并加载了 Windows Cache Extension for PHP,PHP 应用程序就可以利用该功能,而无需修改任何代码。
一、Windows缓存扩展类型
Windows 缓存扩展包括 5 种不同类型的缓存。下面将介绍每种缓存类型的用途及其带来的好处。
1、PHP 操作码缓存
PHP 是一个脚本处理引擎,它读取包含文本和/或 PHP 指令的输入数据流,并生成另一个数据流,最常见的是 HTML 格式。这意味着在网络服务器上,每次网络客户端请求 PHP 脚本时,PHP 引擎都会对其进行读取、解析、编译和执行。读取、解析和编译操作会给网络服务器的 CPU 和文件系统带来额外负担,从而影响 PHP 网络应用程序的整体性能。PHP 字节码(操作码)缓存用于将编译后的脚本字节码存储在共享内存中,以便 PHP 引擎在后续执行同一脚本时重复使用。
Wincache 2.0.0 取消了对操作码缓存的支持,所有希望使用操作码缓存的用户都应使用 PHP 附带的 OPcache 扩展。
2、文件缓存
即使启用了 PHP 操作码缓存,PHP 引擎也必须访问文件系统上的脚本文件。当 PHP 脚本存储在远程 UNC 文件共享上时,文件操作会带来很大的性能开销。PHP 的 Windows 缓存扩展包含一个文件缓存,用于在共享内存中存储 PHP 脚本文件的内容,从而减少 PHP 引擎执行的文件系统操作量。
3、解析文件路径缓存
PHP 脚本经常使用相对文件路径来包含或操作文件。PHP 引擎必须将每个文件路径规范化为绝对文件路径。当 PHP 应用程序使用许多 PHP 文件并通过相对路径访问这些文件时,解析路径的操作可能会对应用程序的性能产生负面影响。PHP 的 Windows 缓存扩展提供了一个 “解析文件路径 “缓存,用于存储相对路径和绝对文件路径之间的映射,从而减少 PHP 引擎必须执行的路径解析次数。
4、用户缓存(自 1.1.0 版起可用)
PHP 脚本可通过使用用户缓存 API 来利用共享内存缓存。PHP 对象和变量可以存储在用户缓存中,然后在后续请求中重复使用。这可用于提高 PHP 脚本的性能,并在多个 PHP 进程中共享数据。
5、会话处理程序(自 1.1.0 版起可用)
WinCache 会话处理程序可用于将 PHP 会话数据存储在共享内存缓存中。这避免了读写会话数据时的文件系统操作,从而提高了在 PHP 会话中存储大量数据时的性能。
二、安装和配置
1、安装要求
该扩展目前仅支持以下配置:
Windows 操作系统:
- 配备 IIS 5.1 和 ” FastCGI 扩展 ” 的 Windows XP SP3;
- 配备 IIS 6.0 和 ” FastCGI 扩展模块 ” 的 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,非线程安全构建;
- PHP 5.3 X86,非线程安全 VC9 版本。
2、安装
该扩展有两个软件包:一个软件包适用于 PHP 5.2.X,另一个软件包适用于 PHP 5.3.X。
按照以下步骤安装并启用扩展:
- 将软件包解压到某个临时位置;
- 将文件复制到 PHP 扩展文件夹中。通常这个文件夹被称为 “ext”,与所有 PHP 二进制文件位于同一文件夹中。例如:.php_wincache.dllC:\Program Files\PHP\ext;
- 使用文本编辑器打开 php.ini 文件,该文件通常与所有 PHP 二进制文件位于同一文件夹中。例如:. C:\Program Files\PHP\php.ini;
- 在 php.ini 文件末尾添加以下一行:. extension = php_wincache.dll;
- 保存并关闭文件;
- 回收 IIS Application Pools for PHP 以接收配置更改。要检查扩展是否已启用,请创建一个调用 phpinfo 函数的 PHP 代码文件;
- 将该文件保存在使用 PHP 的 IIS 网站的根文件夹中,然后打开浏览器,向 http://localhost/phpinfo.php 提出请求。在返回的网页中搜索名为 . 如果扩展已启用,则 phpinfo 输出将列出 WinCache 提供的配置设置。
3、运行时配置
- wincache.fcenabled bool:启用或禁用文件缓存功能;
- wincache.fcenabledfilter string:定义一个以逗号分隔的 IIS 网站标识符列表,在该列表中应启用或禁用文件缓存。此设置与 wincache.fcenabled 配合使用:如果 wincache.fcenabled 设置为 1,则 wincache.fcenabledfilter 中列出的网站将关闭文件缓存;如果 wincache.fcenabled 设置为 0,则 wincache.fcenabledfilter 中列出的网站将打开文件缓存;
- wincache.fcachesize int:定义分配给文件缓存的最大内存大小(以兆字节为单位)。如果所有缓存文件的总大小超过了此设置中指定的值,那么大部分过期文件将从文件缓存中删除;
- wincache.fcndetect bool:启用或禁用文件更改通知检测功能。如果支持文件更改通知,那么一旦文件系统中的相应文件被修改,就会立即刷新操作码和文件缓存条目。如果不支持文件更改通知,例如在使用网络文件共享时,wincache 将以 wincache.chkinterval 指定的固定时间间隔轮询文件更改;
- wincache.maxfilesize int:定义允许缓存的单个文件的最大大小(千字节)。如果文件大小超过指定值,则不会缓存该文件。此设置仅适用于文件缓存;
- wincache.ocenabled bool:从 2.0.0.0 起,该选项已被删除,启用或禁用操作码缓存功能;
- wincache.ocenabledfilter :字符串从 2.0.0.0 起该选项已被删除定义启用或禁用操作码缓存的 IIS 网站标识符逗号分隔列表。此设置与 wincache.ocenabled 配合使用:如果 wincache.ocenabled 设置为 1,则 wincache.ocenabledfilter 中列出的网站将关闭运算码缓存;如果 wincache.ocenabled 设置为 0,则 wincache.ocenabledfilter 中列出的网站将打开运算码缓存;
- wincache.ocachesize int:从 2.0.0.0 起该选项已被删除定义为操作码缓存分配的最大内存大小(以兆字节为单位)。如果缓存的操作码大小超过了指定值,那么大部分过时的操作码将从缓存中删除。请注意,操作码缓存大小必须至少是文件缓存大小的 3 倍。否则,操作码缓存大小将自动增加;
- wincache.filecount int:定义扩展需要缓存的文件数量,以便在启动时分配适当的内存大小。如果文件数超过指定值,WinCache 将根据需要重新分配更多内存;
- wincache.chkinterval int:定义扩展检查文件更改以刷新缓存的频率(以秒为单位)。将其设置为 0 将禁止刷新缓存。除非 scavenger 删除了该文件的缓存条目,或 IIS 应用程序池被回收,或调用了 wincache_refresh_if_changed函数,否则文件更改不会反映在缓存中;
- wincache.ttlmax int:定义未被使用的缓存条目的最长生存时间(秒)。将其设置为 0 将禁用缓存清道夫,因此在 IIS Worker 进程的生命周期内,缓存条目永远不会从缓存中删除;
- wincache.enablecli bool:定义 PHP 在命令行 (CLI) 模式下运行时是否启用缓存;
- wincache.ignorelist string:定义扩展不应缓存的文件列表。文件列表仅使用文件名指定,并用管道符号”|”分隔;
wincache.ignorelist 示例:
wincache.ignorelist = "index.php|misc.php|admin.php"
- wincache.namesalt string:定义一个字符串,用于命名存储在共享内存中的特定扩展对象。这样做是为了避免 IIS 工作进程中的其他应用程序试图访问共享内存时可能造成的冲突。命名字符串的长度不能超过 8 个字符;
- wincache.ucenabled bool:启用或禁用用户缓存功能;
- wincache.ucachesize int:定义分配给用户缓存的最大内存容量(以兆字节为单位)。如果存储在用户缓存中的变量的总大小超过指定值,那么最陈旧的变量将从缓存中删除;
- wincache.scachesize int:定义为会话缓存分配的最大内存大小(以兆字节为单位)。如果会话缓存中存储的数据总大小超过指定值,则会从缓存中删除最陈旧的数据;
- wincache.rerouteini string:自 1.3.7 起,该选项已被删除;
- wincache.reroute_enabled:指定 reroute.ini 文件的绝对路径或相关路径。该文件包含 PHP 函数列表,其实现应被 WinCache 函数等效替换。如果指定的是相对路径,则假定该路径相对于 php-cgi.exe 文件的位置;
- wincache.reroute_enabled bool:启用或禁用通过文件缓存重路由某些文件 I/O 功能;
- wincache.srwlocks bool:从 2.0.0.0 起,该选项已被删除。启用或禁用共享读写器锁。禁用该选项有助于解决 WinCache 中的死锁问题;
- wincache.filemapdir :字符串指定一个目录的绝对路径,WinCache 将在该目录中存储用于共享内存段的临时文件。该目录必须位于本地计算机上,而不是网络文件系统上。如果未指定目录,WinCache 将为所有共享内存段使用 Windows 系统页面文件。
4、WinCache数据统计脚本
WinCache 的安装包中包含一个 PHP 脚本,用于获取缓存信息和统计数据。
如果 WinCache 扩展是通过 Microsoft 网络平台安装程序安装的,则该脚本位于 .NET Framework 3.0 中。在 64 位版本的 Windows Server 操作系统中,该脚本位于 。 如果扩展是手动安装的,则该脚本将位于提取安装包内容的同一文件夹中。
%SystemDrive%\Program Files\IIS\Windows Cache for PHP\%SystemDrive%\Program Files (x86)\IIS\Windows Cache for PHPwincache.php
使用时,将其复制到网站的根文件夹或任何子文件夹中。要保护脚本,请在任何文本编辑器中打开它,并替换 USERNAME 和 PASSWORD 常量的值。
wincache.php 的验证配置示例:
<?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 将会话数据存储在共享内存会话缓存中。使用共享内存而不是默认的文件会话存储,有助于提高在会话对象中存储大量数据的 PHP 应用程序的性能。Wincache 会话缓存使用文件支持的共享内存,可确保会话数据在 IIS 应用程序池回收时不会丢失。
要配置 PHP 使用 WinCache 会话处理程序,请将 php.ini 设置 session.save_handler 设为 wincache。默认情况下,Windows 临时文件位置用于存储会话数据。要更改会话文件的位置,请使用 session.save_path 指令。
启用 WinCache 会话处理程序示例:
session.save_handler = wincache session.save_path = C:\inetpub\temp\session\
6、WinCache功能重路由
WinCache 函数重路由(自 WinCache 1.2.0 起可用,自 WinCache 1.3.7.0 起已移除)可用于将 PHP 内置函数替换为针对特定目的进行了优化的等效函数。WinCache 扩展包括经过 Windows 优化的 PHP 文件函数实现,当 PHP 需要访问网络共享上的文件时,可以提高 PHP 应用程序的性能。优化实现适用于以下函数:
- file_exists
- file_get_contents
- readfile
- is_readable
- is_writable
- is_dir
- realpath
- filesize
要配置 WinCache 以使用 reroutes 功能,请使用 WinCache 安装包中的 reroute.ini 文件。将该文件复制到 php.ini 文件所在的同一目录下。然后在 php.ini 中添加 wincache.rerouteini 设置,并指定 reroute.ini 文件的绝对路径或相对路径。
启用 WinCache 重路由功能示例:
wincache.rerouteini = C:\PHP\reroute.ini
注意: 如果启用了 WinCache 功能 reroutes,建议增加 WinCache 文件缓存大小。这可以通过使用 wincache.fcachesize 设置来实现。
reroute.ini 文件包含本地 PHP 函数与 WinCache 中对应函数之间的映射。文件中的每一行都使用以下语法定义映射:
<PHP function name>:[<number of function parameters>]=<wincache function name>
在以下示例中,只有当传递给函数的参数数量小于或等于 2 时,对 PHP 函数 file_get_contents() 的调用才会被替换为对 wincache_file_get_contents() 的调用。 当替换函数无法处理所有函数参数时,指定参数数量非常有用。
Reroute.ini 文件内容示例:
[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函数
- wincache_fcache_fileinfo – 读取文件缓存中缓存的文件信息;
- wincache_fcache_meinfo – 读取有关文件缓存内存使用情况的信息;
- wincache_lock – 获取指定键的独占锁;
- wincache_ocache_fileinfo – 读取操作码缓存中缓存的文件信息;
- wincache_ocache_meminfo – 读取有关操作码缓存内存使用情况的信息;
- wincache_refresh_if_changed – 刷新缓存文件的缓存条目;
- wincache_rplist_fileinfo – 读取有关解析文件路径缓存的信息;
- wincache_rplist_meminfo – 读取解析文件路径缓存的内存使用信息;
- wincache_scache_info – 读取会话缓存中缓存的文件信息;
- wincache_scache_meminfo – 读取有关会话缓存内存使用情况的信息;
- wincache_ucache_add – 仅当缓存中还不存在变量时,在用户缓存中添加变量;
- wincache_ucache_cas – 将变量与旧值进行比较并赋予新值;
- wincache_ucache_clear – 删除用户缓存中的全部内容;
- wincache_ucache_dec – 减少与键相关联的值;
- wincache_ucache_delete – 从用户缓存中删除变量;
- wincache_ucache_exists – 检查用户缓存中是否存在变量;
- wincache_ucache_get – 获取存储在用户缓存中的变量;
- wincache_ucache_inc – 增加与键相关联的值;
- wincache_ucache_info – 读取存储在用户缓存中的数据信息;
- wincache_ucache_meminfo – 读取有关用户缓存内存使用情况的信息;
- wincache_ucache_set – 在用户缓存中添加变量,如果缓存中已存在变量,则覆盖该变量;
- wincache_unlock – 释放给定键的独占锁。
四、为Windows构建
1、先决条件
- PHP 源代码;
- PHP 构建环境;
- WinCache 源代码。
2、编译和构建
以下步骤介绍了如何在 Windows 操作系统上编译和构建 WinCache:
(1)打开用于编译 PHP 的命令提示符.
(2)转到 PHP 源所在的根目录
(3)运行命令
cscript.exe win32\build\buildconf.js
(4)运行命令
configure.bat --help
输出结果将包含一个新标志–enable-wincache。
(5)运行命令
configure.js [all options used to build PHP] --enable-wincache
–enable-wincache是唯一需要的额外选项,以确保正确构建 WinCache 扩展。该选项将构建 WinCache 并将其与 PHP dll 进行静态链接。要将 WinCache 扩展作为独立的 DLL 生成,请使用 –enable-wincache=shared 选项。
(6)运行命令
nmake
3、验证编译
以下步骤描述了如何验证 WinCache 的构建是否正确:
1、转到构建 PHP 二进制文件的文件夹
2、运行命令
php.exe -n -d extension=php_wincache.dll -re wincache
如果 WinCache 已正确构建,该命令的输出将列出 WinCache 支持的 INI 指令和函数。