cnizzardini / cakephp-preloader
CakePHP 的 OPCache 预加载插件
Requires
- php: ^8.1
- cakephp/cakephp: ^5.0
Requires (Dev)
- cakephp/cakephp-codesniffer: ^5.0
- phpmd/phpmd: ^2.10
- phpstan/phpstan: ^1.0
- phpunit/phpunit: ^10
README
为 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=root
和 opcache.preload=/srv/app/preload.php
。
这是在启用 OPCache 预加载时,对于 JSON 响应每秒多出 28% 的请求数,对于 JSON + 简单 SQL 选择每秒多出 21% 的请求数。
测试 / 分析
测试套件
composer test
测试套件 + 静态分析
composer check