【问题标题】:Is PDO connected to database immediately or after prepare/queryPDO 是立即连接到数据库还是在准备/查询之后连接到数据库
【发布时间】:2019-04-07 23:26:51
【问题描述】:

我正在尝试编写一些包含多个类的代码,这些类稍后会有很多数据库连接/查询。

我的问题是,PDO 是否会在执行以下行后立即连接到数据库,并且会一直保持连接直到关闭?

$pdo = new PDO($dsn, $user, $pass, $options);

或者它等到我们执行以下操作才能连接,例如:

$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$email]);
$user = $stmt->fetch();

// Closing connection
$stmt = null;

如果在我们执行new PDO() 时没有立即连接,那么我可以轻松地将$pdo 变量设为全局变量并在每个类中使用它,否则我必须在每个类中分别使用__construct() 方法连接,然后在__destruct() 方法上关闭连接。 (我仍然不确定这是否是获得更好性能的最佳方式)

附:我们是否还需要设置$pdo = null 来关闭连接?还是$stmt = null就够了?

【问题讨论】:

  • Upon successful connection to the database, an instance of the PDO class is returned to your script. The connection remains active for the lifetime of that PDO object. To close the connection, you need to destroy the object by ensuring that all remaining references to it are deleted—you do this by assigning NULL to the variable that holds the object. If you don't do this explicitly, PHP will automatically close the connection when your script ends.php.net/manual/en/pdo.connections.php
  • “我仍然不确定这是否是获得更好性能的最佳方式” ????它不是。将连接作为依赖项传递给您的类构造函数
  • @Phil 你能举个例子吗?

标签: php database pdo


【解决方案1】:

当您实例化new PDO() 时,它将尝试保持与数据库的连接。

通过创建 PDO 基类的实例来建立连接。

Source

我建议avoid using global variables,除非您的代码库相对较小。您将在不应该共享的地方共享您的数据库实例!

也许我们可以生成一个单例类来获取您的数据库连接。这样一来,一旦您的数据库工作完成,我们就可以获得连接的单个实例并在关闭连接之前完成所有需要的工作。

早点关闭数据库连接会很好。但是,PHP 会在脚本执行完毕后为您完成。

如果您没有明确地这样做,PHP 将在您的脚本结束时自动关闭连接。

Source

我希望这会有所帮助! ??

【讨论】:

  • 您的单例示例存在一些严重问题,即不可接受的错误报告和错误的字符集处理。我建议再找一个。更不用说单例本身就是一个有问题的解决方案,与全局变量有同样的问题
  • 啊,我现在很乐意删除它,谢谢你的信息!你有什么建议?
  • @J.Doe 过早的优化是万恶之源,你的假设就是这个规则的完美例子。为了避免可想象的(!)性能问题,您将在现实中破坏性能。因为它在每个类中都连接将确保您的数据库服务器已死。因此,文本时间尝试在您遇到实际问题而不是虚构问题时尝试提高性能。
  • @J.Doe 顺便说一下,您链接的页面的作者,我只能重复它所说的内容 - 如果您的代码组织不良,可以使用它进行权衡。尽管如此,在性能方面它与依赖注入相同。只要你保持一个连接,所有的方法都是一样的。
  • @J.Doe 详细说明我之前所说的话。连接每个类有很多缺点。您不能在类之间使用事务或其他连接绑定功能。连接是比较慢的操作,所以越多性能越差。当然还有臭名昭著的太多连接错误。一个典型的应用程序可能有数百或数千个对象,这意味着打开了数百或数千个连接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 2015-01-14
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多