3

每次执行脚本时,我都会建立与数据库的连接。它是通过将 PDO 实例分配给全局$db变量来完成的,然后将其传递给控制器​​。

$db = new \ay\pdo\PDO('mysql:dbname=foo;charset=utf8');

但是,由于有缓存逻辑层,95% 的请求不需要执行单个查询。虽然建立连接的 5 毫秒似乎并不重要,但它是请求时间的 30%。当每分钟处理多达 20 万个请求时,这是一个很大的数字。

应用程序

我只想在有要执行的查询时建立与数据库的连接。在不对脚本造成重大开销的情况下实现此目标的推荐方法是什么?

4

2 回答 2

2

您可以/可以使用代理设计模式。因此,当您第一次请求数据时,它将处理/创建与 db 的连接。

因此,直接使用 PDO 创建代理对象,当有查询时,它会创建与 db 的连接,并查询它(延迟加载),然后它会重用相同的 PDO 对象。

http://en.wikipedia.org/wiki/Proxy_pattern

http://en.wikipedia.org/wiki/Flyweight_pattern

代理示例:https ://github.com/ezimuel/PHP-design-patterns/blob/master/Proxy.php

于 2013-06-15T07:55:31.780 回答
1

不要使用 $db->method,而是使用 db()->method。db() 将是 pbject 中的一个函数或函数,它返回一个单例 db 对象/如果连接存在,则返回它,否则创建它并返回它。

编辑:参考评论,也许单例或全局函数不是您想要的。我得到的是无论如何你可以创建一个具有所有连接参数的对象 $db ,但没有创建连接。然后你可以调用类似的东西

$db->getDb()->method 

getDb() 将首先检查 $db 是否有连接,如果没有。然后它创建它。您必须在每次调用之前拥有 getDb() ,或者在 $db 对象内部。

于 2013-06-15T08:02:36.730 回答