alcidesrc / cache
一个PHP类,通过打包/解包模式优化可缓存数组
dev-main
2024-08-25 14:38 UTC
Requires
- php: ^8.3
Requires (Dev)
- fakerphp/faker: ^1.23
- php-parallel-lint/php-console-highlighter: ^1.0
- php-parallel-lint/php-parallel-lint: ^1.3
- phpmd/phpmd: ^2.15
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^11.0
- slope-it/clock-mock: ^0.4.0
- squizlabs/php_codesniffer: ^3.9
- symfony/var-dumper: ^7.0
This package is auto-updated.
Last update: 2024-09-25 17:00:41 UTC
README
缓存打包器
此仓库包含一个PHP类,允许优化可缓存数组以优化所需内存消耗。
[目录]
安装
您可以通过composer安装此包
$ composer require alcidesrc/cache
工作原理
在许多场景中,我们缓存结构化信息(通常来自数据库)。该结构中的每一行与前一行具有相同的模式,与下一行也相同。
在序列化这种结构之前,列名称被存储了多次,正如包含的行数一样,消耗资源来跟踪的信息根本不可变和不可预测。
Packer类提供了一个名为pack
的静态方法,允许创建具有以下模式的新结构
$packed = [ 'keys' => ['column-name-1', 'column-name-2', ..., 'column-name-z'], 'data' => [ [ 'row-1-value-1', 'row-1-value-2', ... 'rown-1-value-z' ], [ 'row-n-value-1', 'row-n-value-2', ... 'rown-n-value-z' ], ], ];
这种优化的模式现在可以被缓存,并减少平均25%的内存消耗。有关详细信息,请参阅统计部分。
要将此模式恢复到原始结构,Packer类还提供了一个名为unpack
的静态方法,将模式恢复到初始状态。
示例
源数据集
// $users = DB::table('users')->get() $users = [ [ 'id' => 1, 'firstName' => 'Hope', 'lastName' => 'Pacocha', 'email' => 'eblanda@hotmail.com', 'address' => '1939 Julio Shore. Zboncakland, HI 21531-7243', 'city' => 'Lethatown', 'postcode' => '84445-4109', 'country' => 'Niger', ], [ 'id' => 2, 'firstName' => 'Lyric', 'lastName' => 'Parker', 'email' => 'bennett.mitchell@balistreri.org', 'address' => '25071 Jacklyn Dam Suite 215. Lake Alexannemouth, IL 77929-0777', 'city' => 'Port Yvetteville', 'postcode' => '00537', 'country' => 'French Southern Territories', ], ];
直接序列化
a:2:{i:0;a:8:{s:2:"id";i:1;s:9:"firstName";s:4:"Hope";s:8:"lastName";s:7:"Pacocha";s:5:"email";s:19:"eblanda@hotmail.com";s:7:"address";s:43:"1939 Julio Shore Zboncakland, HI 21531-7243";s:4:"city";s:9:"Lethatown";s:8:"postcode";s:10:"84445-4109";s:7:"country";s:5:"Niger";}i:1;a:8:{s:2:"id";i:2;s:9:"firstName";s:5:"Lyric";s:8:"lastName";s:6:"Parker";s:5:"email";s:31:"bennett.mitchell@balistreri.org";s:7:"address";s:61:"25071 Jacklyn Dam Suite 215 Lake Alexannemouth, IL 77929-0777";s:4:"city";s:16:"Port Yvetteville";s:8:"postcode";s:5:"00537";s:7:"country";s:27:"French Southern Territories";}}
使用Packer进行序列化
a:2:{s:4:"keys";a:8:{i:0;s:2:"id";i:1;s:9:"firstName";i:2;s:8:"lastName";i:3;s:5:"email";i:4;s:7:"address";i:5;s:4:"city";i:6;s:8:"postcode";i:7;s:7:"country";}s:4:"data";a:2:{i:0;a:8:{i:0;i:1;i:1;s:4:"Hope";i:2;s:7:"Pacocha";i:3;s:19:"eblanda@hotmail.com";i:4;s:43:"1939 Julio Shore Zboncakland, HI 21531-7243";i:5;s:9:"Lethatown";i:6;s:10:"84445-4109";i:7;s:5:"Niger";}i:1;a:8:{i:0;i:2;i:1;s:5:"Lyric";i:2;s:6:"Parker";i:3;s:31:"bennett.mitchell@balistreri.org";i:4;s:61:"25071 Jacklyn Dam Suite 215 Lake Alexannemouth, IL 77929-0777";i:5;s:16:"Port Yvetteville";i:6;s:5:"00537";i:7;s:27:"French Southern Territories";}}}
反序列化
[ 'keys' => ['id', 'firstName', 'lastName', 'email', 'address', 'city', 'postcode', 'country'], 'data' => [ [ 1, 'Hope', 'Pacocha', 'eblanda@hotmail.com', '1939 Julio Shore. Zboncakland, HI 21531-7243', 'Lethatown', '84445-4109', 'Niger', ], [ 2, 'Lyric', 'Parker', 'bennett.mitchell@balistreri.org', '25071 Jacklyn Dam Suite 215. Lake Alexannemouth, IL 77929-0777', 'Port Yvetteville', '00537', 'French Southern Territories', ], ], ];
统计
用法
此包可以作为库使用。
示例:使用库
<?php use Cache\Packer; // Reduce by 25% memory consuptions in average by using Packer $users = Packer::unpack(cache()->remember('users', 300, function () { return Packer::pack( DB::table('users')->get() ); }));
测试
您可以通过composer运行测试套件
$ composer tests
单元测试
此库提供了一个PHPUnit测试套件,包括12个单元测试和22个断言
Time: 00:01.038, Memory: 20.00 MB OK (12 tests, 22 assertions)
代码覆盖率
代码覆盖率报告摘要
Code Coverage Report:
2024-08-25 12:03:18
Summary:
Classes: 100.00% (1/1)
Methods: 100.00% (2/2)
Lines: 100.00% (23/23)
Cache\Exceptions\WrongPackerSchemaException
Methods: ( 0/ 0) Lines: ( 0/ 0)
Cache\Packer
Methods: 100.00% ( 2/ 2) Lines: 100.00% ( 23/ 23)
质量保证
静态分析器
您可以使用PHPStan检查此库
$ composer analyse
此命令生成以下报告
> phpstan analyse --configuration=phpstan.neon --memory-limit 1G --ansi
3/3 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
[OK] No errors
检查编码风格
您可以使用PHP_CodeSniffer 检查此库
$ composer check-style
此命令生成以下报告
> phpcs -p --standard=PSR12 --exclude=Generic.Files.LineLength --runtime-set ignore_errors_on_exit 1 --runtime-set ignore_warnings_on_exit 1 src tests ... 3 / 3 (100%) Time: 49ms; Memory: 8MB
安全漏洞
请查看我们的安全策略,了解如何报告安全漏洞
请勿公开披露与安全相关的问题
支持的版本
只有最新主要版本才会收到安全修复。
报告漏洞
如果您在此项目中发现安全漏洞,请在此处打开一个问题。所有安全漏洞都将得到及时解决。
许可
MIT许可证(MIT)。有关更多信息,请参阅许可文件。