PHP性能:Is";“全球”;关键词优于;包括「;在功能上?

PHP性能:Is";“全球”;关键词优于;包括「;在功能上?,php,performance,pdo,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

让我们假设我有一个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`');
    ...
}
?>

给这个人一些医生,他需要


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

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

但是,这并不意味着多次包含Database.php总是会比较慢。假设您启用了opcache,多次包含同一个文件的开销将非常小。问题是,由于代码的编写方式,每次包含此文件时都会打开一个新的PDO连接


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

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

但是,这并不意味着多次包含Database.php总是会比较慢。假设您启用了opcache,多次包含同一个文件的开销将非常小。问题是,由于代码的编写方式,每次包含此文件时都会打开一个新的PDO连接

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

  • 全球状态很糟糕
  • 重复创建数据库连接是错误的
  • 好:

    $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;
    
    确定:

    $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;
    
    上帝层:

    $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;
    
    见:

  • 全球状态很糟糕
  • 重复创建数据库连接是错误的
  • 好:

    $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;
    
    确定:

    $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;
    
    上帝层:

    $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;
    

    请参阅:

    这并不是关于全局与包含,而是关于每次实例化一个新的PDO连接实例,而不是重复使用同一个连接。我认为您不应该将业务层与控制器层混淆。使用DIC@bassxzero可接受答案中的“DIC”非常糟糕。这与DI应该如何工作正好相反。@ishegg所以自己去回答这个问题吧。我只是给他指出了正确的方向。希望他能在谷歌上四处搜索,而不是复制和粘贴。这不是全局与包含,而是每次实例化一个新的PDO连接实例,而不是重复使用同一个连接。我认为你不应该将业务层与控制器层混淆。使用DIC@bassxzero“DIC”在公认的答案中,这是可怕的。这与DI应该如何工作正好相反。@ishegg所以自己去回答这个问题吧。我只是给他指出了正确的方向。希望他能用谷歌搜索,而不是复制和粘贴。这是个好答案!;-)不过需要注意的是:我直接将“OK”版本命名为“BAD”(关于配置数组和紧耦合):以及。让我们假设我有一个基本的网站,有index.php、home.php、contact.php。。。它们都需要数据库连接。我们选择“上帝层”解决方案,那么PDO实例将在哪里生成?为了随时重复使用相同的数据库连接?在理想情况下,您没有PHP文件和页面的1:1映射。您有一个带有请求路由器(例如:)的应用程序,该应用程序是用DI从内到外构建的。您有一个例子吗?一个很好的答案!;-)不过需要注意的是:我直接将“OK”版本命名为“BAD”(关于配置数组和紧耦合):以及。让我们假设我有一个基本的网站,有index.php、home.php、contact.php。。。它们都需要数据库连接。我们选择“上帝层”解决方案,那么PDO实例将在哪里生成?为了随时重复使用相同的数据库连接?在理想情况下,您没有PHP文件和页面的1:1映射。您有一个带有请求路由器(例如:)的应用程序,该应用程序是用DI从内到外构建的。您有一个例子吗?