contagt / composer-preload
使用composer命令预加载您的代码到opcache,使代码运行更快
Requires
- php: ^8.2
- composer-plugin-api: ^2.0
- ayesh/php-timer: ^2.1.1
- symfony/finder: ^6
Requires (Dev)
- composer/composer: ^2.0.13
- phpunit/phpunit: ^10
- roave/security-advisories: dev-latest
This package is auto-updated.
Last update: 2024-09-28 11:20:07 UTC
README
使用composer命令预加载您的代码到opcache以使代码运行更快。
Composer Preload是一个Composer插件,旨在提供和补充PHP opcache预热。此插件引入了一个新的composer preload
命令,该命令可以生成一个包含调用预热opcache缓存的vendor/preload.php
文件(在vendor/autoload.php
模式之后)。
工作原理
目前,此插件会递归地在给定的路径中查找.php
文件,并创建一个调用opcache_compile_file
或require_once
函数的文件,具体取决于配置中选择的机制。
安装
您可以通过与安装普通composer包相同的方式安装此插件
composer require contagt/composer-preload
如果您想全局安装
composer g require contagt/composer-preload
配置
1: 编辑您的composer.json
文件,如果尚不存在,则创建一个名为extra
的部分。以下是一个示例
{
"extra": {
"preload": {
"paths": [
"app",
"bootstrap",
"config"
"vendor"
],
"exclude": [
"app/core/tests",
"app/core/lib/Drupal/Component/Assertion",
"app/core/modules/simpletest",
"app/core/modules/editor/src/Tests"
],
"extensions": ["php", "module", "inc", "install"],
"exclude-regex": [
"/[A-Za-z0-9_]test\\.php$/i",
],
"no-status-check": false,
"mechanism": "compile",
"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
修饰符使匹配不区分大小写。
对于目录分隔符,即使在Windows系统上使用反斜杠(\
),也始终使用Unix样式的正斜杠(/
)。不要忘记正确转义正则表达式模式以在JSON语法中工作;例如,用反斜杠转义斜杠(\
和/
)为反斜杠(\
-> \\
和/
-> \/
)。
这将使正则表达式难以阅读,但是 ¯\(ツ)/¯。
###extra.preload.no-status-check
: 可选,默认:false
如果将此设置设置为true
(您还可以传递--no-status-check
命令行选项),则生成的preload.php文件将不会包含任何额外的检查以确保opcache已启用。此设置默认禁用,生成的preload.php
文件将在顶部包含一个小片段,表示opcache未启用。
extra.preload.files
: 可选
要包含的各个文件的数组。此设置是可选的。这些文件必须在执行composer preload
命令时存在。
extra.preload.mechanism
: 可选,默认:compile
默认情况下,预加载器将通过opcache_compile_file()
将文件上传到Opcache。这避免了执行项目中的任何文件,但不会从编译的文件中解析任何链接(特性、接口、扩展类等)。在预加载时可能会出现一些未解析链接的警告(没有什么危险)。
您可以使用useRequire()
来更改此设置,这将更改到require_once
,并沿着Composer自动加载器(通常位于vendor/autoload.php
)的路径解析链接。
预加载
要执行实际预加载,请运行vendor/preload.php
。
如果您为CLI应用程序启用了opcache,可以直接调用php vendor/preload.php
来预加载生成的PHP文件并立即预热缓存。
在Web服务器环境中,一旦生成,请在php.ini
中将此文件用作启动时的预加载器。
opcache.preload=/app/vendor/preload.php
一旦生成脚本,建议您重新启动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代码中可用。您仍然需要包含文件来使它们可用。
您可以使用require
机制,用require_once
函数代替opcache_compile_file
,以作为将文件填充到opcache的机制。
我有vendor/preload.php
文件。接下来怎么办?
生成文件后,您可能需要实际运行它才能有效地将文件加载到Opcache中。理想情况下,您应该在每次重启Web服务器或PHP服务器时都这样做,具体取决于您如何在Web服务器中提供PHP。
从PHP 7.4开始,php.ini
中有一个选项opcache.preload
,允许您指定这个生成的文件,或者一个独立的文件,该文件调用您服务器上所有vendor/preload.php
文件,以主动预热缓存。
路线图
- ☐ 扩展
extras.preload
部分以配置应预加载的包,而不是设置单个路径。 - ☐ 显示文件生成进度的进度条
- ☐ 标志以生成文件并运行它,以便缓存立即预热。
- ☐ 更美观的进度条。
- ⭕ 完全测试覆盖率。
- ☐ 更美观的进度条,显示opcache内存使用情况等。
- ⭕ 在GitHub上获得许多星标。