marcocesarato / cpdo
此包可以从缓存变量中检索PDO查询结果。它扩展了基本PDO类,并覆盖了一些函数来处理数据库查询执行并将查询结果存储在变量中。该类还可以为之前执行过的查询返回缓存查询的结果,以便更快地检索重复查询的结果。
Requires
- php: >=5.1.2
- ext-json: *
- ext-pdo: *
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.15
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
- 安装Composer
- 输入
composer require marcocesarato/cpdo
- 享受
用法
您必须将此类用作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的相同方法,并增加了以下方法