PHP性能:“全局”关键字在功能上比“包含”更好吗?

时间:2017-10-23 17:22:30

标签: php performance pdo

让我假装我有一个 database.php 文件,其中包含对数据库的持久访问权。

<?php
$database = new PDO('mysql:host=xxx', "xxx", "xxx", array(
    PDO::ATTR_PERSISTENT => true
));
?>

每次我想在控制器中查询数据库时,我该怎么办?

1 /使用global关键字获取我的全局$ database变量

<?php

include '../app/config/Database.php';

function getLastOfTheWeek()
{
    global $database;
    $database->query('SELECT * FROM `xxx`');
    ...
}
?>

2 /在函数中包含database.php

<?php

function getLastOfTheWeek()
{
    include '../app/config/Database.php';
    $database->query('SELECT * FROM `xxx`');
    ...
}
?>

3 /给这个人一些文件,他需要它

或者两者都是邪恶的,我应该使用另一种方法。

2 个答案:

答案 0 :(得分:2)

  1. 全球状态不好。
  2. 反复创建数据库连接很糟糕。
  3. 不可

    $dbh = new PDO (...);
    
    function doSomething($dbh) {
      $dbh->query(...);
    }
    

    确定:

    class Something {
      protected $dbh;
    
      public function __construct($db_config) {
        $this->dbh = new PDO($db_config); // still bad
      }
    
      public function doSomething() {
        $this->dbh->query();
      }
    }
    

    上帝层:

    class Something {
      protected $dbh;
    
      public function __construct(PDO $dbh) {
        $this->dbh = $dbh;
      }
    
      public function doSomething() {
        $this->dbh->query();
      }
    }
    
    $dbh = new PDO(...);
    $s = new Something($dbh);
    $s->doSomething;
    

    请参阅:http://www.phptherightway.com/#dependency_injection

答案 1 :(得分:1)

在这个简化的示例中,假设您有多个函数或函数调用,全局将会有更好的性能,因为全局将重新使用相同的连接。

但是,这并不意味着多次包含Database.php总是会变慢。假设您启用了opcache,多次包含同一文件将会产生很少的开销。问题是,每次包含此文件时都会打开一个新的PDO连接,因为您的代码是如何编写的。

还有很多其他解决方案不涉及使用全局。 DI容器通常用于在应用程序启动时解决依赖关系。如果您总是想重新使用相同的连接,单例设计模式也可能是有益的。