此包可以从缓存变量中检索PDO查询结果。它扩展了基本PDO类,并覆盖了一些函数来处理数据库查询执行并将查询结果存储在变量中。该类还可以为之前执行过的查询返回缓存查询的结果,以便更快地检索重复查询的结果。

0.2.3.44 2019-09-12 12:13 UTC

This package is auto-updated.

Last update: 2024-09-16 17:35:18 UTC


README

版本: 0.2.3.47 beta

Github: https://github.com/marcocesarato/PHP-CPDO

作者: Marco Cesarato

描述

此包可以从缓存变量中检索PDO查询结果。

它扩展了基本PDO类,并覆盖了一些函数来处理数据库查询执行并将查询结果存储在变量中。

该类还可以为之前执行过的查询返回缓存查询的结果,以便更快地检索重复查询的结果。

它允许在内存(RAM)中缓存SELECT/SHOW/DESCRIBE查询。然后执行后,缓存将被删除。

INSERT/UPDATE/DELETE/TRUNCATE...时仅对单个表进行缓存清理。

它解决的问题

当我们调用相同的查询(例如基于ORM的系统)时,我们会从数据库中检索相同的数据,进行相同的操作,有时会过度负载数据库服务器(例如多次检索大量数据)。

此类可以防止对数据库执行相同的查询,在某些情况下,从内存中检索数据而不过度负载数据库服务器。

要求

  • PHP
  • 数据库

支持的数据库 (CPDO::connect)

  • 4D
  • CUBRID
  • Firebird/Interbase
  • IBM
  • Informix
  • MS SQL Server
  • MySQL
  • ODBC和DB2
  • Oracle
  • PostgreSQL
  • SQLite

安装

Composer

  1. 安装Composer
  2. 输入composer require marcocesarato/cpdo
  3. 享受

用法

您必须将此类用作PDO。

CPDO引入了以下新方法

方法 connect

此功能是DSN自动生成,您必须使用它而不是构造函数。

使用connect的方法

$db = CPDO::connect($database_type, $database_name, $database_host = null, $database_user = null, $database_pswd = null);

方法 getTables

返回所有数据库表的名称作为array

方法 backup

您可以通过一个array选择要备份的表,以备份数据(目前不支持TRIGGERS、VIEWS和EVENTS,如果您需要,可以向开发者请求)。

使用backup的方法

$db->backup($backup_dir, $backup_tables = '*');

缓存

您可以使用以下方法禁用/启用缓存(默认为禁用)

$db->disableCache();
$db->enableCache();

或者

CPDOCache::disable();
CPDOCache::enable();

可用方法

  • void CPDOCache::enable() 启用缓存
  • void CPDOCache::disable() 禁用缓存
  • void CPDOCache::populate(array $cache) 填充缓存(请参见以下持久化缓存)
  • array CPDOCache::retrieve() 检索缓存(请参见以下持久化缓存)
  • void CPDOCache::addException(string $table_name) 添加不可缓存的表
  • void CPDOCache::addExceptions(array $tables_name) 添加不可缓存的表

调试器

您可以使用以下方法启用/禁用调试器(默认为启用)

$db->enableDebug();
$db->disableDebug();

或者

CPDOLogger::enable();
CPDOLogger::disable();

可用方法

  • void CPDOLogger::enable() 启用缓存
  • void CPDOLogger::disable() 禁用缓存
  • array CPDOLogger::getLogs(); 获取完整日志(包括执行时间和是否使用缓存)
  • array CPDOLogger::getQueries() 获取所有请求的查询
  • int CPDOLogger::getCounter() 获取请求查询的计数器
  • void CPDOLogger::cleanLogs(); 清除日志

获取完整日志的示例 getLogs()

array (
  'count' => 3,
  'queries' => 
  array (
    'SET NAMES \'utf8\'' => 
        array (
          0 => 
          array (
            'time' => 1530610903,
            'execution_time' => 0.000247955322265625,
            'cached' => false,
          ),
          1 => 
            array (
              'time' => 1530610903,
              'execution_time' => 0.000077955322265625,
              'cached' => false,
            ),
        ),
    'SELECT id FROM _deleted_records_ WHERE table = \'settings\' LIMIT 1' => 
        array (
          0 => 
          array (
            'time' => 1530610903,
            'execution_time' => 0.00050687789916992188,
            'cached' => false,
          ),
        ),
  ),
)

(不推荐) 持久化缓存

PS:此用法不推荐!!!

如果您想使用持久化缓存,可以使用CPDOCache::populate方法来填充缓存,以及使用CPDOCache::retrieve方法来检索缓存。

通过这些方法,您可以实现一个持久化缓存系统,将数据编码(使用JSON或序列化)后存储,并在恢复缓存时使用。

优点

  • 减轻数据库压力
  • 减少查询次数

缺点

  • 可能会损害数据完整性
  • 可能会变慢(磁盘性能/连接的客户端数量)

使用示例

// Your loader/includes... => with require_once('CPDO.php');

$database_cache_path = '/your/cache/path/database.json';

$cache = file_get_contents($database_cache_path);
$cache = json_decode($cache); // Or unserialize (slower)
CPDOCache::populate($cache);
unset($cache);


// Your code...


$cache = CPDOCache::retrieve();
$cache = json_encode($cache); // Or serialize (slower)
file_put_contents($database_cache_path, $cache);
unset($cache);

方法

CPDO

PDO的相同方法,并增加了以下方法

CPDOLogger

CPDOCache