ayesh / composer-preload
使用 composer 命令将您美好的代码预加载到 opcache 中,使您的代码运行更快
Requires
- php: ^8.1
- composer-plugin-api: ^2.0
- ayesh/php-timer: ^2.1.1
- symfony/finder: ^5.0.7
Requires (Dev)
- composer/composer: ^2.0.13
- phpunit/phpunit: ^9.5.20
README
使用 composer 命令将您美好的代码预加载到 opcache 中,使您的代码运行更快。
Composer Preload 是一个 composer 插件,旨在提供和补充 PHP opcache 加热。此插件引入了一个新的 composer preload
命令,可以生成一个包含调用 opcache 缓存预热的 vendor/preload.php
文件(遵循 vendor/autoload.php
模式)。
请注意,此插件目前处于非常原始的状态,强烈建议不要在生产系统中使用。任何贡献都热烈欢迎!
如何工作
目前,此插件递归地扫描给定路径中的 .php
文件,并创建一个调用 opcache_compile_file
函数的文件。
当您想要预热缓存时,您可以在命令行中调用 php vendor/preload.php
,或者当 PHP 7.4 推出时,配置 PHP 自动加载此文件。
安装
就像安装普通的 composer 包一样,您也可以安装此插件。
composer require ayesh/composer-preload
如果您想全局安装
composer g require ayesh/composer-preload
配置
1: 修改您的 composer.json
文件,如果尚不存在,则创建一个名为 extra
的部分。以下是一个示例
{
"extra": {
"preload": {
"paths": [
"web"
],
"exclude": [
"web/core/tests",
"web/core/lib/Drupal/Component/Assertion",
"web/core/modules/simpletest",
"web/core/modules/editor/src/Tests"
],
"extensions": ["php", "module", "inc", "install"],
"exclude-regex": "/[A-Za-z0-9_]test\\.php$/i",
"no-status-check": false,
"files": [
"somefile.php"
]
}
}
}
extra.preload
指令包含此插件的全部配置选项。paths
指令必须是一个相对于 composer.json
文件的目录数组。这些目录将递归地扫描 .php
文件,转换为绝对路径,并附加到 vendor/preload.php
文件中。
2: 运行 composer preload
命令。
3: 执行生成的 vendor/preload.php
文件。您可以选择运行 php vendor/preload.php
或使用您的 web 服务器执行它。有关更多信息,请参阅下面的预加载部分。
配置选项
extra.preload.paths
: 必需
一个目录路径数组,用于查找 .php
文件。此设置目前是必需的。目录必须在运行 composer preload
命令时存在。
extra.preload.exclude
: 可选
一个目录路径数组,用于排除 preload.php
。此列表必须相对于 composer.json 文件,类似于 paths
指令。这是限制 paths
指令作用域的理想用例。
extra.preload.extensions
: 可选,默认:["php"]
一个要搜索的文件扩展名数组。如果不输入,它将搜索所有 .php
文件。不要输入前面的点号(.
)字符。上面的示例适用于 Drupal。对于 Symfony/Laravel 项目,您可以保留默认选项 ["php"]
或不使用此选项,使其默认为仅 .php
。
extra.preload.exclude-regex
: 可选
设置一个与 PCRE 兼容的完整正则表达式(包括界定符和修饰符),它将与完整路径匹配,如果匹配,则从预加载列表中排除。这可以帮助您排除测试从预加载列表中。
例如,要排除所有类似 PHPUnit 的测试,您可以使用正则表达式 /[A-Za-z0-9_]test\\.php$/i
。这将确保文件名以 "test.php" 结尾,但还有一个字母数字或下划线前缀。这是 PHPUnit 测试的常见模式。/i
修饰符使匹配不区分大小写。
对于目录分隔符,始终使用Unix风格的正斜杠(/
),即使您使用的是使用反斜杠(\
)的Windows系统。不要忘记正确转义正则表达式模式以在JSON语法中工作;例如,将斜杠(\
和 /
)用反斜杠(\
)转义(\
-> \\
和 /
-> \/
)。这将使正则表达式难以阅读,但 ¯\(ツ)/¯。
extra.preload.no-status-check
:可选,默认:false
如果此设置设置为 true
(您也可以传递命令行选项 --no-status-check
),则生成的 preload.php
文件将不包含检查以确保opcache已启用的额外检查。此设置默认禁用,并且生成的 preload.php
文件将包含顶部的一个小片段,如果opcache未启用,则使其退出。
extra.preload.files
:可选
要包含的单个文件数组。此设置是可选的。文件必须在运行 composer preload
命令时存在。
预加载
要执行实际的预加载,请执行 vendor/preload.php
。
如果您已为CLI应用程序启用了opcache,则可以直接调用 php vendor/preload.php
来执行生成的PHP文件并立即预热缓存。
此插件的未来版本将具有生成文件并立即运行的功能。
在Web服务器环境中,或者当您不能使用CLI php
二进制文件运行PHP文件时。这可能意味着您想将 vendor/preload.php
链接到您的docroot中的某个位置并curl它。例如,ln -s vendor/preload.php path/to/docroot/preload.php
然后在Web服务器启动时执行 curl localhost/preload.php
。
常见问题解答
此插件到底做什么?
此插件可以在 vendor/preload.php
处创建一个新文件,该文件遵循Composer的自动加载器在 vendor/autoload.php
中的模式。此新的 preload.php
文件包含几个函数调用,它们编译PHP文件并将它们缓存到PHP的opcache中。PHP Opcache是PHP中的一个共享内存(具有可选的文件存储选项)功能,可以存储编译的PHP文件,因此当文件被调用时不需要重复编译相同的文件。这是一个持久的内存,直到PHP重启或缓存最终被清除。
在opcache中缓存文件具有显著的性能优势,但代价是内存。
所以所有文件都一直加载吗?
所有文件都加载到 Opcache 中。这 不 与您使用 include()
或 require()
类相同,这会使PHP实际执行代码。当您将代码缓存到Opcache时,那些类不会执行 - 只是将它们的编译代码缓存到内存中。
例如,如果您声明一个变量,此插件的重载功能不会使变量在您的PHP代码中可用。您仍然需要包含文件才能使其可用。
我有了 vendor/preload.php
文件。接下来是什么?
生成文件后,您可能需要实际运行它以有效地将文件加载到Opcache中。理想情况下,您应该在每次重启Web服务器或PHP服务器时这样做,具体取决于您如何在Web服务器中提供PHP。
PHP 7.4有一个 php.ini
选项 opcache.preload
,您可以指定此生成的文件或一个单独的文件,该文件调用您在服务器上所有 vendor/preload.php
文件,以主动预热缓存。
我在同一服务器上运行多个Composer项目。
您可以为每个项目生成预加载文件,然后将其包含在您自己创建的单独PHP文件中。然后,调用所有生成的 vendor/preload.php
文件。
默认情况下,预加载文件顶部将包含一个小的代码片段,如果Opcache不可用,则会立即退出脚本。如果您计划从另一个脚本中包含此vendor/preload.php
文件,可以使用特殊的命令行选项composer preload --no-status-check
,这将使vendor/preload.php
文件不包含这些检查,因此您可以在所有项目中包含多个vendor/preload.php
文件,而不必重复运行相同的代码片段。建议在这样做之前确保Opcache已启用。您可以从生成的预加载文件之一中复制粘贴代码片段。
我可以在一个服务器上生成预加载文件并在另一个服务器上使用它吗?
是的。类似于vendor/autoload.php
文件,此插件生成的vendor/preload.php
文件也使用相对路径。从版本v0.1.0
开始,您可以在一个服务器上生成预加载文件,并在其他服务器(目录层次结构)上重复使用它。
您仍然需要在您想要预加载opcache的所有服务器上运行vendor/preload.php
文件。
路线图
- ☐ 扩展
extras.preload
部分以配置应预加载的包,而不是设置单独的路径。 - ✓ 设置排除模式的特性(v0.0.3)
- ☐ 显示文件生成进度的进度条
- ☐ 标志生成文件和运行它,以便立即预热缓存。
- ☐ 更漂亮的进度条。
- ⭕ 完整的测试覆盖率。
- ☐ 更漂亮的进度条,显示opcache内存使用情况等。
- ⭕ 获得许多GitHub星标