【问题标题】:PHP Performance : Is "global" keyword better than "include" in function?PHP 性能:函数中的“global”关键字是否优于“include”?
【发布时间】:2018-04-04 08:10:18
【问题描述】:

假设我有一个 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/ 给这个人一些文档,他需要它

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

【问题讨论】:

  • 这不是关于全局与包含,而是关于每次实例化一个新的 PDO 连接实例而不是重复使用相同的连接。
  • 我认为你不应该把你的业务层和控制器层混为一谈。
  • @bassxzero 接受的答案中的“DIC”很糟糕。这与 DI 的工作方式相反。
  • @ishegg 所以自己去回答这个问题吧。我只是在为他指明正确的方向。希望他会到处搜索而不是复制和粘贴。

标签: php performance pdo


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:
    1. 全局状态不好。
    2. 重复创建数据库连接是不好的。

    好:

    $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

    【讨论】:

    • 一个很好的答案! ;-) 不过请注意:“OK”版本我将直接命名为“BAD”(关于配置数组和紧密耦合):The Clean Code Talks - Don't Look For Things!James Mallison - Dependency Injection and Dependency Inversion in PHP
    • 假设我有一个基本的网站,有index.php、home.php、contact.php...所有这些都需要数据库连接。我们选择“God Tier”方案,那么PDO实例会在哪里制作呢?为了随时重复使用相同的数据库连接?
    • 在理想情况下,您没有 PHP 文件和页面的 1:1 映射。您有一个带有请求路由器的应用程序(例如:FastRoute),并且该应用程序是使用 DI 从内到外构建的。
    • 你有例子吗?
    猜你喜欢
    • 1970-01-01
    • 2011-06-21
    • 2018-09-22
    • 1970-01-01
    • 2016-07-10
    • 2011-12-06
    • 2011-01-21
    • 2013-10-18
    • 2011-09-30
    相关资源
    最近更新 更多