ahmyi/composer-preload

使用 composer 命令将你的甜蜜代码预载入 opcache,使代码运行更快

安装次数: 36

依赖者: 0

建议者: 0

安全: 0

星星: 1

关注者: 1

分支: 11

类型:composer-plugin

v0.0.9 2019-11-28 16:32 UTC

This package is auto-updated.

Last update: 2024-09-16 11:13:06 UTC


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.phpexport.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星标