keistlestone / composer-preload
使用 composer 命令预加载您的代码到 opcache,使您的代码运行更快
Requires
- php: ^8.0
- composer-plugin-api: ^2.0
- ayesh/php-timer: ^2.1.1
- symfony/finder: ^3.4.18 || ^4.0.14 || ^4.1.7 || ^4.2.0 || ^5.0.7
Requires (Dev)
- composer/composer: ^1.7.2 || ^2.0
- phpunit/phpunit: ^8.5.3 || ^9.0.2
README
使用 composer 命令预加载您的代码到 opcache,使您的代码运行更快。
Composer Preload 是一个 composer 插件,旨在提供和补充 PHP opcache 加热。该插件引入了一个新的 composer preload
命令,可以生成一个 vendor/preload.php
文件(遵循 vendor/autoload.php
模式),其中包含调用以预热 opcache 缓存的代码。
请注意,此插件目前处于非常原始的状态,强烈建议不要在生产系统中使用。欢迎任何贡献!
工作原理
目前,此插件递归地在给定路径中查找 .php
文件,并创建一个调用 opcache_compile_file
函数的文件。
当您想要预热缓存时,您可以在命令行中调用 php vendor/preload.php
,或者当 PHP 7.4 发布时,配置 PHP 以自动加载此文件。
安装
就像安装正常的 composer 包一样,您也可以安装此插件。
composer require keilestone/composer-preload
如果您想全局安装
composer g require keilestone/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文件时,这通常意味着您可能需要在docroot中某处链接 vendor/preload.php
并通过curl调用它。例如,ln -s vendor/preload.php path/to/docroot/preload.php
然后在Web服务器启动时执行 curl localhost/preload.php
。
常见问题解答
此插件到底做什么?
此插件可以在 vendor/preload.php
中创建一个新文件,该文件遵循Composer的autoloader在 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星标。