pinepain / simple-config
轻量级且灵活的配置管理库
Requires
- php: >=5.4.0
- nikic/php-parser: 1.*
Requires (Dev)
- mikey179/vfsstream: 1.*
- phpunit/phpunit: 4.*
This package is not auto-updated.
Last update: 2022-02-01 13:16:04 UTC
README
Php Simple Config
关于
这是一个处理配置值的库。它设计得直观、最小化、轻量级、快速且可扩展。
该库结合了知名且可识别的PHP(并不仅限于PHP)框架中使用的方法。
特性
- 直观且简单
- 处理配置的最佳实践
- 支持缺失项的默认值
- 灵活性(是的,有人可能会说它非常灵活,以至于你需要支持它)
- 最小化和可扩展的代码库
- 设计为具有松耦合的代码(至少是假定的)
- 速度(从你见过的所有中速度最快之一,营销人员可能会添加“接近裸金属”,但这并不真实,因为我们都知道)
安装
composer require pinepain/simple-config 0.*
配置加载
由于这个库试图保持事情简单,所以 Config
类只需要配置项数组,因此你可以有任何你想要的和你的应用程序需要的配置加载逻辑。
直接从盒子里就有 FilesLoader
配置加载器,它简单地 require
单个目录下的所有文件,并将返回的项目存储在以文件基本名为键的配置数组中。
限制
- 不支持嵌套配置加载(位于嵌套目录中的配置)。
- 以点字符(
.
)开头的点文件和扩展名不是.php
的文件将被忽略。 - 文件基本名(不含路径和扩展名)中包含点的文件不支持(下面说明为什么)。
假设我们有这样的目录结构
example/config
├── .dotfile.php
├── app.php
├── cache.php
├── db.php
├── mail.php.old
└── somedir/
└── somefile.php
然后从 config
目录加载配置将只加载 app.php
、cache.php
和 db.php
文件,并将 .dotfile.php
和 mail.php.old
文件忽略,并完全跳过 somedir/
的内容。
注意
文件名中包含点(不包括基本名和扩展名之间的点)将导致不可访问的配置部分,例如配置文件 db.old.php
将被解释为 [ 'db.old' => ... ]
条目,而我们不能通过点表示法访问它,因为我们假设每个点代表一个嵌套级别。
虽然这样的配置部分是模糊的,但这种命名方式不被该库支持。
示例
<?php require __DIR__ . '/../vendor/autoload.php'; use Pinepain\SimpleConfig\Loaders\FilesLoader; use Pinepain\SimpleConfig\Config; $loader = new FilesLoader(__DIR__ . '/config'); $config_items = $loader->load(); $config = new Config($config_items); $config->has('some.value.you.are.looking.for'); $config->get('some.value'); // will return all nested values under 'some.value' section $config->set('some.value', 'changed'); // change it // get item value or use default value if original item missed (and it is as we change it above) $config->get('some.value.you.are.looking.for', 'missed');
注意:虽然这个库是一个块集,但它是用思考和希望构建的,希望你会使用一些IoC容器,但你可以手动完成所有这些。
优化和缓存
由于这个库试图保持事情简单,所以 Config
类只需要配置项数组,因此你可以有任何你想要的和你的应用程序需要的配置加载逻辑。
除了FilesLoader
加载器外,还有FileCacheLoader
和MergedFilesLoader
加载器,它们旨在通过将所有配置项存储在一个文件中来优化配置加载时间,以减少文件操作。它们之间的主要区别是FileCacheLoader
加载器存储已经计算好的配置项,而MergedFilesLoader
将配置文件内容原样合并到一个文件中。如果您急于了解它们之间的区别,请查看下面的示例。
缓存
如果您想缓存加载的配置,请使用FileCacheLoader
,它需要一个实现LoaderInterface
接口的任何配置加载器以及一个用于存储缓存配置项的文件路径。它具有非常简单的逻辑:它寻找缓存的文件,如果存在,则返回所需的requre
结果,如果没有找到缓存的文件,则使用传递的加载器加载配置项并将其缓存到文件中,然后将其返回给用户。
优化
开箱即用的FilesLoader
加载器和FileCacheLoader
缓存加载器在大多数情况下可以完美配合工作。但是,如果您遵循12因子应用程序方法和在环境中存储配置,并且还在配置文件中依赖它们,那么您必须在每次环境变量更改时清除缓存。在进行一些配置文件中的动态计算时,您甚至无法使用缓存。
在这种情况下,MergedFilesLoader
加载器就派上用场了。它需要一个FilesLoader
和一个用于存储合并配置文件的文件。
加载器的逻辑是将所有配置文件合并到一个文件中,并在适当的部分下进行,这样只需要进行一次文件操作,但实际的配置文件代码仍然在require
上执行。
MergedFilesLoader
仅限于配置文件解析,并希望它不会用于配置用于编程的情况,因此它假定您有一个简单的配置,其中包含return
语句,该语句在require
上返回配置项。
MergedFilesLoader
使用nikic/php-parser构建。
示例
假设我们有两个文件
// app.php return [ 'env' => getenv('APP_ENV') ?: 'prod', ]; // db.php return [ 'connections' => [ 'default' => [ 'driver' => 'mysql', 'host' => getenv('DB_HOST') ?: 'localhost', 'port' => 3306, 'user' => getenv('DB_USER') ?: 'guest', 'password' => getenv('DB_PASSWORD') ?: 'secret', ] ] ];
并且假设我们没有设置环境变量。
缓存将导致以下内容
// app.php return [ 'app' => [ 'env' => 'prod', ], 'db' => [ 'connections' => [ 'default' => [ 'driver' => 'mysql', 'host' => 'localhost', 'port' => 3306, 'user' => 'guest', 'password' => 'secret', ] ] ] ];
合并将导致
// app.php return [ 'app' [ 'env' => getenv('APP_ENV') ?: 'prod', ], 'db' =>[ 'connections' => [ 'default' => [ 'driver' => 'mysql', 'host' => getenv('DB_HOST') ?: 'localhost', 'port' => 3306, 'user' => getenv('DB_USER') ?: 'guest', 'password' => getenv('DB_PASSWORD') ?: 'secret', ] ] ] ];
如果您更改环境变量的值并且不使缓存无效,那么您很可能会遇到麻烦。使用合并,您不太可能遇到这种问题。对于FileCacheLoader
和MergedFilesLoader
,性能几乎相同(运行php example/benchmark_loaders.php
以查看您环境中的确切结果)。
性能
您可以使用php example/benchmark_loaders.php
命令在您的环境中运行基准测试。
以下是ssd驱动器上的常见结果
Running bench with 1 repeats
Simple loading: 0.00033092498779297
Merged loading: 0.026033163070679
Cached loading: 0.00065708160400391
Running bench with 100 repeats
Simple loading: 0.030107975006104
Merged loading: 0.015130996704102
Cached loading: 0.0095160007476807
Running bench with 1000 repeats
Simple loading: 0.24485111236572
Merged loading: 0.068234920501709
Cached loading: 0.058425903320312
Running bench with 10000 repeats
Simple loading: 2.4374539852142
Merged loading: 0.61219501495361
Cached loading: 0.52797985076904
Running bench with 100000 repeats
Simple loading: 22.758585929871
Merged loading: 5.8093478679657
Cached loading: 5.6891360282898
此基准测试在每次travis构建结束时运行,因此您可以通过查看构建结果来检查结果。
下一步是什么
使用提供的ConfigInterface
注入配置依赖项,并在您的项目中使用它。您可以自由地报告任何问题或提出新的加载器或一些新的酷想法来改进这个库。
配置接口
<?php namespace Pinepain\SimpleConfig; interface ConfigInterface { /** * @param array | \ArrayObject $items */ public function __construct($items); /** * Get all of the configuration items. * * @return array */ public function all(); /** * Determine if the given configuration value exists. * * @param string $key * @return bool */ public function has($key); /** * Get the specified configuration value. * * @param string $key * @param mixed $default * @return mixed */ public function get($key, $default = null); /** * Set a given configuration value. * * @param string $key * @param mixed $value * @return void */ public function set($key, $value = null); }
配置加载接口
<?php namespace Pinepain\SimpleConfig\Loaders; interface LoaderInterface { /** * Load config items * * @return array | \ArrayObject */ public function load(); }
备注
本库非目标功能
- 配置项验证逻辑。
- 以带颜色和格式的花哨方式导出配置项。
这些功能不是本库的目标,而是特定于应用或框架的逻辑。