classpreloader / classpreloader
通过生成包含特定用例所有自动加载文件的单一PHP文件来帮助提高类加载性能
Requires
- php: ^7.0.8 || ^8.0
- ext-tokenizer: *
- nikic/php-parser: ^4.10.3
Requires (Dev)
- bamarni/composer-bin-plugin: ^1.4.1
- graham-campbell/analyzer: ^2.4.3 || ^3.0.4
- phpunit/phpunit: ^6.5.14 || ^7.5.20 || ^8.5.19
README
此工具用于生成包含特定用例所需所有类的单一PHP脚本。使用单个编译的PHP脚本而不是依赖于自动加载可以帮助提高特定用例的性能。例如,如果您的应用程序在每次请求上都执行相同的引导代码,那么您可以生成一个预加载器(此工具的编译输出),以减少重复自动加载所需类的成本。
实际功能
此工具监听每个被自动加载的文件,创建一个文件列表,使用PHP解析器遍历解析的PHP文件以及任何Config对象的访问者,如果需要,将每个文件的代码包装在命名空间块中,并将每个自动加载的文件的内容(按顺序)写入单个PHP文件。
注意
此工具仅适用于特定用例。预加载类和自动加载类之间存在权衡。不再有生成预加载器的好处的时间点是应用程序特定的。您需要自行进行基准测试,以确定此工具是否会加快您的应用程序。
安装
将ClassPreloader作为依赖项添加到您的composer.json文件中,通过在require块中添加"classpreloader/classpreloader": "^4.1"
。注意,如果您想使用cli工具,则还需要在require块中添加"classpreloader/console": "^3.1"
。
使用工具
您可以使用./vendor/bin/classpreloader
编译命令与一些命令行标志来生成预加载器。
--config
:一个CSV文件,包含要组合到类图中的文件列表,或者返回数组或ClassPreloader\ClassLoader\Config
对象的完整路径的PHP脚本。
--output
:存储编译后的PHP代码的文件路径。如果目录不存在,则工具将尝试创建它。
--skip_dir_file
:(无值) 跳过包含__DIR__
或__FILE__
的文件以使缓存可移植。
--fix_dir
:(默认为1) 设置为0以不将__DIR__
常量替换为原始文件的实际目录。
--fix_file
:(默认为1) 设置为0以不将__FILE__
常量替换为原始文件的实际位置。
--strict_types
:(默认为0) 设置为1以启用严格类型模式。
--strip_comments
:(默认为0) 设置为1以从每个源文件中删除注释。
编写配置文件
创建基于PHP的配置文件相当简单。只需包含文件vendor/classpreloader/classpreloader/src/ClassLoader.php
,并调用方法ClassPreloader\ClassLoader::getIncludes()
,传递一个函数作为唯一参数。此函数应接受一个ClassPreloader\ClassLoader
对象,并使用$loader->register()
注册传入对象的自动加载器。在所有其他自动加载器注册后注册ClassPreloader\ClassLoader
自动加载器非常重要。
配置文件必须返回一个数组或ClassPreloader\ClassLoader\Config
。如果您需要在将文件写入输出之前对每个匹配的文件进行任何类型的转换,则可以附加自定义节点访问者。
<?php // Here's an example of creating a preloader for using the // Amazon DynamoDB and the AWS SDK for PHP 2. require __DIR__.'/src/Config.php'; require __DIR__.'/src/ClassNode.php'; require __DIR__.'/src/ClassList.php'; require __DIR__.'/src/ClassLoader.php'; use ClassPreloader\ClassLoader; $config = ClassLoader::getIncludes(function (ClassLoader $loader) { require __DIR__.'/vendor/autoload.php'; $loader->register(); $aws = Aws\Common\Aws::factory([ 'key' => '***', 'secret' => '***', 'region' => 'us-east-1' ]); $client = $aws->get('dynamodb'); $client->listTables()->getAll(); }); // Add a regex filter that requires all classes to match the regex. // $config->addInclusiveFilter('/Foo/'); // Add a regex filter that requires that a class does not match the filter. // $config->addExclusiveFilter('/Foo/'); return $config;
接下来,您将运行classpreloader脚本,并传入上述PHP脚本的完整路径。
./vendor/bin/classpreloader compile --config="/path/to/the_example.php" --output="/tmp/preloader.php"
上述命令将在/tmp/preloader.php中创建一个文件,包含在运行匿名函数中的代码片段时自动加载的每个文件。您需要生成此文件并将其包含在生产脚本中。
使用Composer自动化流程
您可以使用Composer的脚本功能自动化创建预加载器的过程。例如,如果您想在安装AWS SDK for PHP时自动创建预加载器,您可以在composer.json文件中定义如下脚本
{ "require": { "classpreloader/console": "^3.1" }, "scripts": { "post-autoload-dump": "@php vendor/bin/classpreloader compile --config=/path/to/the_example.php --output=/path/to/preload.php" }, "config": { "bin-dir": "bin" } }
使用上述composer.json文件,每次使用install或update命令重新创建项目自动加载器时,都会执行classpreloader.php文件。此脚本将生成一个preload.php文件,其中包含运行先前展示的"the_example.php"配置文件所需的类。
安全性
如果您在此包中发现安全漏洞,请发送电子邮件至Graham Campbell,地址为graham@alt-three.com。所有安全漏洞都将得到及时处理。您可以在此处查看我们的完整安全策略here。
许可证
Class Preloader遵循MIT许可证(MIT)。
企业版
作为Tidelift订阅的一部分提供
classpreloader/classpreloader
的维护者以及成千上万的其他包维护者正在与Tidelift合作,为构建应用程序时使用的开源依赖项提供商业支持和维护。节省时间,降低风险,提高代码质量,同时支付您确切使用的依赖项的维护者。了解更多信息Learn more.