cnizzardini/cakephp-preloader

CakePHP 的 OPCache 预加载插件

安装次数: 15,413

依赖关系: 0

建议者: 1

安全: 0

星标: 10

关注者: 4

分支: 2

开放性问题: 1

类型:cakephp-plugin

v1.0.0 2023-10-14 00:56 UTC

This package is auto-updated.

Last update: 2024-09-21 18:24:07 UTC


README

Latest Version on Packagist Build Coverage Status License: MIT CakePHP Minimum PHP Version

为 CakePHP 提供一个 OPCache 预加载器。

参考: https://php.ac.cn/manual/en/opcache.preloading.php

此包旨在为 CakePHP 应用程序开发人员提供生成预加载文件的一种简单方式。目标

  • 使用简单命令生成 OPCache 预加载器。
  • 允许可选加载额外的资源,例如 CakePHP 插件、用户应用程序和 composer 包。
  • 提供用于编写自定义预加载器的简单 API。

对于另一种方法,请查看 DarkGhostHunter/Preloader

对于 OPCache UI,请查看 amnuts/opcache-gui

当前版本适用于 CakePHP 5 和 PHP 8.1,有关 CakePHP 和 PHP 旧版本的版本信息,请参阅之前的发布。

安装

您可以使用 composer 将此插件安装到您的 CakePHP 应用程序中。

安装 composer 包的推荐方法是

composer require cnizzardini/cakephp-preloader

接下来,加载插件

bin/cake plugin load CakePreloader

或通过 CakePHP 插件文档 中的手动步骤。

用法

使用 CakePreloader 最简单的方法是通过控制台命令。此命令可以轻松地作为您应用程序构建过程的一部分包含。

/srv/app $ bin/cake preloader --help
Generate a preload file

Usage:
cake preloader [options]

Options:

--app           Add your applications src directory into the preloader
--help, -h      Display this help.
--name          The preload file path. (default: ROOT . DS . 'preload.php')
--packages      A comma separated list of packages (e.g. vendor-name/package-name) to add to the preloader
--plugins       A comma separated list of your plugins to load or `*` to load all plugins/*
--cli           Should the preloader file exit when run via the php-cli? (default: true)
--quiet, -q     Enable quiet output.
--verbose, -v   Enable verbose output.

您还可以从 config/preloader_config.php 文件加载配置。请注意,命令行参数优先。请参阅 assets/preloader_config.php 以获取示例配置文件。如果您喜欢以其他方式处理配置,请阅读 CakePHP 关于 加载配置文件 的文档。

示例

默认加载 CakePHP 核心文件,不包括 TestSuite、Console、Command 和 Shell 命名空间。预加载文件写入到 ROOT . DS . 'preload.php'

bin/cake preloader

包含 composer 包列表

bin/cake preloader --packages=cakephp/authentication,cakephp/chronos

包含您的 APP 代码

bin/cake preloader --app

包含您项目中所有插件

bin/cake preloader --plugins=*

包含您项目插件的列表

bin/cake preloader --plugins=MyPlugin,MyOtherPlugin

在写入之前的事件

您可以通过监听 CakePreloader.beforeWrite 事件来扩展功能。这个事件在预加载文件写入之前被触发。

(\Cake\Event\EventManager::instance())->on('CakePreloader.beforeWrite', function(Event $event){
    /** @var Preloader $preloader */
    $preloader = $event->getSubject();
    $resources = $preloader->getPreloadResources();
    // modify resources or whatever...
    $preloader->setPreloadResources($resources);
});

有关事件更多内容,请参阅 CakePHP 事件系统 文档。

预加载类

您可以使用与控制台命令相同的类来自定义 OPCache 预加载器。预加载器在底层使用 CakePHP 4.x 的 Filesystem 类的移植版本。

use CakePreloader\Preloader;

$preloader = new Preloader();
$preloader->loadPath('/required/path/to/files', function (\SplFileInfo $file) {
    // optional call back method, return true to add the file to the preloader
    return true;
});

// default path is ROOT . DS . 'preload.php'
$preloader->write('/optional/path/to/preloader-file.php');

性能

显然,这些类型的基准测试应该持保留态度。我在这里使用 apache bench 进行了基准测试:[https://github.com/mixerapi/demo](https://github.com/mixerapi/demo),这是一个 dockerized REST API(基于 alpine 的 LEMP stack 和 php-fpm 8.0)。将 CakePHP 的 DEBUG 设置为 false。

extension=intl.so
extension=pdo_mysql.so
extension=sodium
extension=zip.so
zend_extension=opcache.so

[php]
session.auto_start = Off
short_open_tag = Off
opcache.preload_user=root
opcache.preload=/srv/app/preload.php
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 20000
opcache.memory_consumption = 256
opcache.enable_cli = 0
opcache.enable = 1
opcache.revalidate_freq = 360
opcache.fast_shutdown = 1
realpath_cache_size = 4096K
realpath_cache_ttl = 600

注意:对于没有预加载的运行,禁用了 opcache.preload_user=rootopcache.preload=/srv/app/preload.php

这是在启用 OPCache 预加载时,对于 JSON 响应每秒多出 28% 的请求数,对于 JSON + 简单 SQL 选择每秒多出 21% 的请求数。

测试 / 分析

测试套件

composer test

测试套件 + 静态分析

composer check