alcidesrc/cache

一个PHP类,通过打包/解包模式优化可缓存数组

dev-main 2024-08-25 14:38 UTC

This package is auto-updated.

Last update: 2024-09-25 17:00:41 UTC


README

Continuous Integration

缓存打包器

此仓库包含一个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)。有关更多信息,请参阅许可文件