开启PHP 7.4 Preload为WordPress网站访问加速图文教程

开启PHP 7.4 Preload为WordPress网站访问加速图文教程插图

现在很多小伙伴开始用上了PHP 7.4,甚至有些小伙伴开始用上了PHP 8,其实PHP 7.4有一个很厉害的特性,那就是Preload,中文解释就是预加载。这个机制提前将文件加载到内存当中,可以提升 PHP 程序运行的性能。如果用在WordPress站点中,只要将相应的文件预加载Preload,那就可以起到加速WordPress访问速度的作用。下面,搬主题就给大家介绍一下开启PHP 7.4 Preload为WordPress网站访问加速图文教程。

1、什么是 Preload

引用官方的说法如下:

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

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

 opcache 的工作原理图:

开启PHP 7.4 Preload为WordPress网站访问加速图文教程插图1

图中不难看出,对于执行过的代码,再次执行时将命中 cache,cache 中的 opcode 可以直接被取出,进而执行。从而省了下了词法析,语法分析,编译生成opcode的时间。

但是从 cache 中的 opcode 到执行 opcode 过程中还需要做两件事:

一、将 opcode 从 SHM(cache)中拷贝到处理请求的进程(比如php-fpm、lsphp)空间中。

二、链接,也就是解决依赖问题。

比如:

A.php

class A{
    ...
}

B.php

class B extends A{
    ...
}

每个文件是单独编译并生成opcode的,所以当我们使B.php对应的opcode(也就是使用class B)时,还要再去拿A对应的opcode。完成上面两件事后,代码才能真正开始执行。

此外,opcode是可以设置对文件的变化做检查的,比如每隔2秒,看下文件是否有变,如果改变,则cache中的opcode失效,重新编译。

上面这些事,都是在执行之前发生的,是否可以提前做好,把时间省下来呢?可以的,这就是preload的主要工作!

执行前将opcode直接放入处理进程中,提前链接,解决依赖,载入的 opcode 不可更改,省去了检查文件变更及可能的重新编译时间。相应的要求是,如果不重启进程(比如php-fpm、lsphp),代码的修改将不会生效。

2、Preload开启后性能对比 

网上几位同学做的 Preload 的测试结果:

一、Brent 在 Nginx + php-fpm7.4 中测试的 Laravel 框架的测试结果:

1.TPS (每秒事务数)测试,越大越好:

开启PHP 7.4 Preload为WordPress网站访问加速图文教程插图2

2.TPR(每请求耗时)测试,越小越好:

开启PHP 7.4 Preload为WordPress网站访问加速图文教程插图3

这里的 No preloading 指的是单纯开启 Opache 并不启用 preload。Naive preloading 即缓存每个 PHP 文件,有提升但是消耗肯定也会更大更占内存,Optimised preloading 即对被重复引用依赖的关键文件进行 preload。

二、Jani Tarvainen 测试 Symfony 5.0.1 的结果:

开启PHP 7.4 Preload为WordPress网站访问加速图文教程插图4

可见在连接数越来越多的情况下,Preload 带来的性能提升会越来越明显。

总结:

preload 可以提升程序性能,但只有在依赖多的文件缓存才会起到明显效果,所以切记不要将所有文件都预缓存了,这样会导致 php 的启动时间变长,同时占用更多的内存,这样提升的性能反而浪费了更多的资源。

虽然没有 Zend 官方说的 30~50% 的提升来的那么多,但是也有近10%的性能提升。

3、开启PHP 7.4 Preload为WordPress网站访问加速

1、首先要确保自己的PHP版本为7.4或者更高版本。如果你的PHP版本才5.8之类的,那必须先将PHP的版本进行升级。

2、新建一个PHP文件。将下面的代码复制进去。(注意:目前新的版本WordPress使用下面脚本会导致网站出错,建议直接升级到PHP 8即可

<?php
declare( strict_types=1 );

$wp_dir = '/public_html/www/banzhuti.com'; // 这里要注意,这是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 );
        }
    }
}

以上代码只要修改自己的WordPress站点的绝对路径,比如自己的站点放在root文件夹下,或者etc文件夹下,那都要进行相应的修改。

然后将以上代码保存为 preload.php ,将该文件上传到 /public_html/www 文件夹下,和上述的路径保持一致。

3、编辑自己站点的PHP的php.ini文件

至于如何找到自己的站点你的php.ini文件进行修改,搬主题就不多说了。

在[opcache]的后面加上如下代码

opcache.preload=/public_html/www/preload.php  # preload 脚本路径
opcache.preload_user=web     # preload 用户,安全考虑禁止 root 用户

以上的路径记得修改为自己存放脚本的路径。如下图

开启PHP 7.4 Preload为WordPress网站访问加速图文教程插图5

最后,重启PHP进程即可。如果不放心,重启服务器也行。

注意事项:

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

原文链接:开启PHP 7.4 Preload为WordPress网站访问加速图文教程

 收藏 (0) 更新不易,打赏吧

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

除特别注明外,本站所有文章均基于CC-BY-NC-SA 4.0原创,转载请注明出处。
文章名称:《开启PHP 7.4 Preload为WordPress网站访问加速图文教程》
文章链接:https://www.xiapilu.com/web/web-tutorial/php-7-4-preload-wordpress.html
分享到: 生成海报

评论 2

评论前必须登录!

立即登录   注册

  1. #1

    站长,我宝塔面板PHP74开启后重启PHP会报错,然后过了一会儿之后PHP就满载了(已开启opcache)

    老白2年前 (2021-11-17)国内网友谷歌浏览器 Windows 10 登录以回复
    • 目前在WordPress新版本中,原来的脚本会导致500错误,建议要么不用,或者直接升级到PHP8,使用PHP8的原生性能

      虾皮路2年前 (2021-11-17)国内网友谷歌浏览器 Windows 10 登录以回复
切换注册

登录

忘记密码 ?

切换登录

注册

我们将发送一封验证邮件至你的邮箱, 请正确填写以完成账号注册和激活