PHP7.4 新特性 预缓存(Preload )介绍 & WordPress 开启 Preload

PHP7.4 已经发布(主要是因为自己懒 12月没写文章),发布了很多的新特性,在很多开发者社区中看到最吸引人的一项就是预加载(PreLoad)了,这个机制提前将文件加载到内存当中,可以提升 PHP 程序运行的性能

什么是 Preload?
根据 rfc 描述,Preload 简明翻译是预加载,是基于 opcache 的一层升级,也是 opcache 的一部分。现有的 opcache 存储文件可以消除编译开销,但从缓存中获取文件并获取特定请求的上下文仍有相关成本。PHP 仍然需要检查源文件是否已被修改,将类和函数的某些部分从共享内存缓存复制到进程内存等。值得注意的是,由于每个 PHP 文件都完全独立于任何其他文件进行编译和缓存,因此在将文件存储在 opcode 缓存中时,我们无法解决存储在不同文件中的类之间的依赖关系,并且必须在每个请求的运行时重新链接类依赖项。

Preload 的灵感来自为 Java HotSpot VM 设计的"类数据共享"技术。它旨在为用户提供以传统 PHP 模型提供的某些灵活性来换取性能的能力。在服务启动时(在运行任何应用程序代码之前),我们可能会将一组特定的 PHP 文件加载到内存中,并使其内容"永久可用"到该服务器将处理的所有后续请求。这些文件中定义的所有函数和类都可以对现成的请求使用,与内部实体(例如 strlen() 或异常)完全一样。通过这种方式,我们可以预加载整个或部分框架,甚至整个应用程序类库。它还将允许引入以 PHP 编写的"内置"函数(类似于 HHVM 的 sytemlib)。换算的灵活性包括服务器启动后无法更新这些文件(在文件系统上更新这些文件不会执行任何操作;需要重新启动 fpm 服务才能应用更改。此外,此方法与承载多个应用程序的服务器或多个版本的应用程序(对于具有相同名称的某些类具有不同的实现)不兼容,如果此类从一个应用的代码库预加载,则与从其他应用加载不同的类实现将发生冲突。

原理/性能测试/代码解说等一大堆专业废话 请参考 https://www.mf8.biz/php-preload/

这里主要讲解 WordPress 在PHP7.4.3+版本上如何开启Preload?

本文未测试  仅供参考 摘自上面的废话链接

设置 Preload

首先我们需要将 PHP更新至 PHP7.4 或更高版本,然后编辑 php.ini 文件或者专门的 opcache.ini 的配置文件,加入preload的配置代码:

opcache.preload=/path/to/preload.php # preload 脚本路径
opcache.preload_user=web # preload 用户,安全考虑禁止 root 用户
  • opcache.preload string

指定要在服务器启动时期进行编译和缓存的 PHP 脚本文件, 这些文件也可能通过 include 或者 opcache_compile_file() 函数 来预加载其他文件。 所有这些文件中包含的实体,包括函数、类等,在服务器启动的时候就被加载和缓存, 对于用户代码来讲是“开箱可用”的。

  • opcache.preload_user string

考虑到安全因素,禁止以 root 用户预加载代码。该指令方便以其他用户预加载。

注意:

  1. 需要重启方能生效
  2. 多个网站,建议不同 php-fpm 池隔离以增加安全性,因为 preload 的机制多网站混用会不太安全。

WordPress 示例

<?php
declare( strict_types=1 );
$wp_dir = '/path/to/wordpress'; // WordPress 所在的物理路径
$preload_patterns = [
$wp_dir . "wp-includes/Text/Diff/Renderer.php",
$wp_dir . "wp-includes/Text/Diff/Renderer/inline.php",
$wp_dir . "wp-includes/SimplePie/**/*.php",
$wp_dir . "wp-includes/SimplePie/*.php",
$wp_dir . "wp-includes/Requests/**/*.php",
$wp_dir . "wp-includes/Requests/*.php",
$wp_dir . "wp-includes/**/class-*.php",
$wp_dir . "wp-includes/class-*.php",
];
$exclusions = [
$wp_dir . 'wp-includes/class-simplepie.php',
$wp_dir . 'wp-includes/SimplePie/File.php',
$wp_dir . 'wp-includes/SimplePie/Core.php',
$wp_dir . 'wp-includes/class-wp-simplepie-file.php',
$wp_dir . 'wp-includes/class-snoopy.php',
$wp_dir . 'wp-includes/class-json.php',
];
foreach ( $preload_patterns as $pattern ) {
$files = glob( $pattern );
foreach ( $files as $file ) {
if ( ! in_array( $file, $exclusions, true ) ) {
opcache_compile_file( $file );
}
}
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。