contagt/composer-preload

使用composer命令预加载您的代码到opcache,使代码运行更快

安装: 50

依赖者: 0

建议者: 0

安全性: 0

星标: 0

关注者: 0

分支: 11

类型:composer-plugin

1.0.1 2024-03-28 10:04 UTC

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_filerequire_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上获得许多星标。