ahmyi / composer-preload
使用 composer 命令将你的甜蜜代码预载入 opcache,使代码运行更快
Requires
- php: ^7.2
- composer-plugin-api: ^1.0
- ayesh/php-timer: ^2.0.1
- symfony/finder: ^3.4.18 | ^4.0.14 | ^4.1.7 | ^4.2.0
Requires (Dev)
- composer/composer: ^1.7.2
- phpunit/phpunit: ^7.4.4
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 ahmyi/composer-preload
如果你希望全局安装
composer g require ahmyi/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" ], "exclude-files": [ "web/some_file_in_paths_to_exclude.php" ], "export":"webroot/file_to_export.php", "template" : "template/mypreloadtemplate.php" } } }
extra.preload
指令包含此插件的所有配置选项。paths
指令必须是一个数组,包含相对于 composer.json
文件的目录。这些目录将被递归地扫描以查找 .php
文件,转换为绝对路径,并追加到导出的文件路径(默认:vendor/preload.php
)。
2: 运行 composer preload
命令。
3: 执行生成的预载文件。你可以运行 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.template
,则此选项将无效。
extra.preload.files
: 可选
要包含的单个文件的数组。此设置是可选的。文件必须在运行composer preload
命令时存在。
extra.preload.exclude-files
: 可选
要排除的文件路径的数组。此选项适用于将特定文件列入黑名单,该文件opcache永远不会打开但位于路径内且通过所有正则表达式测试。可能要排除的文件示例包括phpinfo.php、测试文件、shell脚本。
extra.preload.export
: 可选,默认:vendor/preload.php
定义要导出到的文件路径和名称。
extra.preload.template
: 可选,默认:vendor/ahmyi/composer-preload/templates/default.php
(no-status-check=true)vendor/ahmyi/composer-preload/templates/withstatus.php (no-status-check=false)
此选项是允许修改现有模板以满足需要或要求。放置[:opcode:]
以定义应该写入操作码的位置。例如。
<?php [:opcode:] ?>
预加载
要执行实际的预加载,执行在extra.preload.export
中定义的文件或如果未定义,则执行vendor/preload.php
。
如果您已为CLI应用程序启用opcache(通过在php.ini中设置opcache.enable_cli
来通过CLI启用opcache),则可以直接调用生成的PHP文件并立即预热缓存。
此插件的未来版本将具有生成文件并立即运行它的功能。
在web服务器上下文中,或者当您无法使用CLI php
二进制文件运行PHP文件时。这可能意味着您可能想要将export.preload.export
链接或定义导出路径到您的docroot的某个位置,并使用curl访问它。
例如,将链接到docroot的命令:ln -s vendor/preload.php path/to/docroot/preload.php
然后在web服务器启动时在web服务器上运行curl localhost/preload.php
。
常见问题解答
此插件到底有什么作用?
此插件可以在vendor/preload.php
或export.preload.export
中定义的位置创建一个新文件,该文件遵循Composer的自动加载器在vendor/autoload.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/preload.php
文件包含在您的版本控制系统中。
路线图
- ☐ 将
extras.preload
部分扩展到配置应预加载的包,而不是设置单个路径。 - ✓ 设置排除模式的特性(v0.0.3)
- ☐ 显示文件生成进度的进度条
- ☐ 标志生成文件并运行它,以便立即预热缓存。
- ☐ 更花哨的进度条。
- ⭕ 完整测试覆盖率。
- ☐ 更花哨的进度条,显示opcache内存使用情况等。
- ☐ 获得许多GitHub星标