foglcz / dibiproxy
dibi数据库层代理驱动集合。
Requires
- php: >=5.4.0
This package is not auto-updated.
Last update: 2024-09-14 12:13:58 UTC
README
DibiProxy
这是dibi数据库层的“代理驱动”集合,您可以在http://www.dibiphp.com上获取
为什么
众所周知。当你准备在某个地方展示某物时,你的整个项目都在本地机器上运行。这种方法在大多数情况下都适用,然而我们面临了一个问题。让我们概述一下
- 我们展示的网站连接到我们的ERP系统
- 会议中无法连接到互联网,我们的账户经理需要展示本地安装
- 我们觉得在账户经理的笔记本电脑上安装整个ERP系统不太舒服
因此我们决定采取另一种方法。让我们安装展示所需的最少数据库。由于项目一直在使用dibi作为DBAL,我们创建了代理类。
如何
代理类位于实际数据库驱动程序之上,缓存所有查询及其结果。当数据库不可用时,数据从缓存中加载。
由于一些查询正在更改数据并加载结果ID,我们实现了“覆盖”概念,其中结果不是通过查询而是通过覆盖键来缓存。因此,更改数据的查询(如插入)在预定义的键下保存并从缓存中加载。
安装
只需将其放入composer.json中
require {
"foglcz/dibiproxy": "1.*"
}
由于dibi驱动程序的加载过程,您在使用之前需要包含适当的驱动程序
require_once 'vendor/foglcz/dibiproxy/lib/drivers/your.selected.driver.php';
然后,只需使用带有“Proxy”前缀的通用驱动程序并启用代理
$config['driver'] = 'proxymysqli'; $config['proxy'] = 'path_to_proxy_file.dat';
如果您有更改数据的查询(插入/更新),则应使用不同的类来连接到数据库
dibiProxy::connect($config);
之后,您可以像往常一样使用dibi::类进行所有数据操作。
用法
当使用“proxy”配置参数时,您应该提供保存代理数据的文件路径。如果您只提供“true”,但没有字符串,则类将在lib/类所在的目录中自动创建数据文件。
这些类工作起来是透明的,因此更新代理类没有其他步骤。代理在无数据库连接时使用。我们的使用方法是,在本地机器上连接可用时点击整个项目 - 然后销毁配置参数,使项目不连接。这次,我们验证结果 - 一切都应按默认方式工作。
更改数据的查询
如果您有一些更新/插入/删除查询,想在调用dibi::query()和/或$connection->*函数之前包含,您需要调用覆盖
dibi::setProxyOverride('some.ident.of.the.query');
这将导致将查询结果在此静态标识符下缓存。因此,您可以在代理项目中运行更改数据库的查询。
Nette框架加载
如果您正在使用Nette框架(这个了不起的东西可以在http://www.nette.org 上获得)并在config.neon文件中使用dibi驱动程序,可以通过这种方式加载代理类
database:
driver: ProxyMysqli
services:
database: DibiProxyConnection(%database%)
...这意味着在配置参数中交换驱动程序,并更改连接类的名称(即更改DibiConnection -> DibiProxyConnection)。
PHP 5.3或5.2
DibiProxy类利用PHP 5.4特征。然而,由于Dibi支持PHP 5.2,如果您想在旧版本的PHP上运行DibiProxy,您需要进行一个简单的更改。
- 首先,选择您想要使用的驱动程序 - 例如ProxyMysqli。该驱动程序位于lib/drivers/ProxyMysqli.php中
- 编辑ProxyMysqli.php文件并删除“use”行
- 打开文件 lib/ProxyTrait.php,并将该 trait DibiProxyTrait 的内容复制过来 {/* 复制括号内的内容 */ }
- 将 trait 的内容替换到包含 use 语句的行。
- 将 trait 文件底部的异常定义复制到驱动文件中。
最终的文件将如下所示: https://gist.github.com/5464ca39375ddacf0041
基本上,这就是 PHP 解析器对 traits 的处理方式。它们基本上是辅助性的复制粘贴,这也是我们为什么要使用它们的原因。
作者和许可
由 Pavel Ptacek(c)2012 热爱创作。
(这些类是在演示前的夜间黑客马拉松中2小时内创建的。欢迎提交拉取请求。)