解析的文件名
解析文件名的 PHP 等效项由realpath()函数获得。如果相对文件名返回规范化的绝对路径名,这会将所有符号链接、对输入路径中的“/./”、“/../”和额外的“/”字符的任何引用与当前工作目录进行转换。换句话说,解析的文件名是一个完整的文件名映射到底层文件系统。由于硬链接等原因,它不一定是唯一的。
OPcache使用解析的文件名作为其内部编译脚本数据库的索引,原因有两个:
拥有相关文件名和嵌入式符号链接会打开各种安全和简单的应用程序编程陷阱,这些陷阱可能会导致错误或启用可利用的漏洞。通过使用每个脚本的解析文件名作为其键,OPcache 避免了这些问题。
这也可以通过安装多个软件包(如 phpBB、WordPress、MediaWiki(我假设为 Joomla))来获得实质性的性能优势,这些软件包通常使用分层 PHP 目录结构。您可以将一个公共子目录的多个版本符号链接到一个共享库文件夹,这样一个包的单独逻辑实例可以共享 OPcache 内部数据库中的相同编译脚本。
查询参数与正在执行的脚本完全不同。参数通常因请求而异,具体取决于请求上下文,但执行的脚本是相同的,对于相同处理路径的任何包含的脚本也是如此。
脚本时间戳
OPcache 使用每个底层脚本文件的时间戳作为辅助键。这是为了能够检测到通常会导致时间戳更改的底层脚本的更改。有各种opcache INI 参数可用于降低性能损失,以及 OPcache API 调用(例如opcache_invalidate())可以使系统管理员显式执行此操作。
由于(标准)OPcache 内部缓存完全在内存中,因此它在文件系统上没有持久版本。因此,每次重新加载底层 PHP 进程层次结构(通常是特定于 Web 服务器)时,都必须重新构建它。是的,这确实会在重新启动缓存时导致启动性能下降。
时间戳的这种使用与脚本编译的缓存有关,并且与任何与应用程序内容相关的缓存完全不同
应用缓存
OPcache 所做的是避免每个请求的编译成本。对于任何基于框架或复杂包(如 Joomla 或 MediaWiki)的 PHP 应用程序,这通常可以占每个请求 CPU 成本的 50-90%,因此可以提高 2-10 倍的吞吐量。
应用程序缓存是特定于应用程序的,并且与避免重复处理应用程序数据的执行应用程序代码的每个请求成本有关。
这些是完全独立的,并且为了获得良好的应用程序性能,您始终应该考虑同时进行。