PHP教程

PHP Windows缓存扩展

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 指令和函数。

广告合作
QQ群号:707632017

温馨提示:

1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com。(#改为@)

2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。

目录