3

我在搞乱teamtreehouse的PHP / MySQL项目中的一个示例站点......在他们的“模型”代码中,他们在一个名为products.php的文件中的函数内有所有数据库调用。这些函数中的每一个都将创建一个新的PDO通过导入包含文件来创建对象.. 例如:

function get_products_recent() {

    require(ROOT_PATH . "inc/database.php");  //this instantiates a new PDO object called $db

    try {
        $results = $db->query("
                SELECT name, price, img, sku, paypal
                FROM products
                ORDER BY sku DESC
                LIMIT 4");
    } catch (Exception $e) {
        echo "Data could not be retrieved from the database. get_products_recent";
        exit;
    }

    $recent = $results->fetchAll(PDO::FETCH_ASSOC);
    $recent = array_reverse($recent);

    return $recent;
}

但是我发现数据库查询显着减慢了页面加载速度..

经过一番谷歌搜索后,我发现 PDO::ATTR_PERSISTENT => true 属性可以添加到 PDO 构造函数中......并且这加快了页面加载速度回到“正常”......

但是对于现实世界的场景来说,这是错误/低效的做法吗..?有没有更好的方法来打开和使用 PDO 对象,而不是在每个进行 db 调用的函数调用中创建一个新的 PDO 对象?

4

2 回答 2

4

是的,你做错了。

是的,您必须在文件开头声明单个PDO 对象并在整个应用程序中使用它。这是一个非常基本的规则,在任何情况下都必须遵守。这不是“最好的”,这是唯一可以接受的设计。

实际上,您实际上是在杀死您的数据库服务器,打开与创建 PDO 对象一样多的连接。连接所消耗的时间并不是唯一的问题——在实时服务器上,最大连接数将立即达到,而使用持久连接会使情况变得更糟。

是的,您应该以其他方式命名您的问题,因为这里的人们从不费心阅读问题主体,而仅通过标题来判断问题。

设置持久连接是错误的解决方案。这个特性有它自己的使用理由,这与纠正最初的错误设计有关。

页面加载缓慢的原因只是每次运行查询时都创建一个新的数据库连接。就如此容易。所以 - 只创建一次 PDO 对象,然后将其作为参数传递(作为最方便且不被狂热者讨厌的解决方案)。

于 2013-10-18T04:18:53.790 回答
-2

我通常创建一个数据库连接类。通常它是一个单例。PDO 对象是类的受保护属性。我的模型文件将扩展这个类。因此,我有一个安全的 PDO 对象,因为它只能由扩展超类的类访问。

您是否使用准备好的语句?这将提高性能。它还将大大降低sqli攻击的风险。

以下是优化数据库性能时需要考虑的其他一些事项:

  • 你用的是什么存储引擎?
  • 你的mysql配置设置是什么?
  • 你在使用主键吗?
  • 您可以使用联接而不是执行多个查询吗?
  • 你可以缓存查询吗?
  • 您是否有任何可能被重构的特别慢的查询?

HTH -- n

于 2013-10-18T04:10:21.343 回答