【问题标题】:Any way to hold a connection to mysql database in PHP?有什么方法可以在 PHP 中保持与 mysql 数据库的连接?
【发布时间】:2013-03-03 13:47:49
【问题描述】:

我正在尝试优化我的一些 PHP 代码。我发现我的 PHP 脚本大部分时间都花在了脚本开头连接到我的 mysql 数据库的过程中。

我只在开始时连接数据库一次,在脚本结束时关闭数据库连接。

但是对于每个请求此页面的用户,都必须建立一个新的连接。

有没有办法保存对数据库的引用并为所有请求共享它?

【问题讨论】:

  • “我认为大多数时候......”你认为如何?你真的测试过吗?如果不测试瓶颈在哪里,做这种事情是没有用的。
  • 您可能还想研究缓存。

标签: php mysql database performance


【解决方案1】:

是的,你可以做到。

如果您使用的是 MySQLi 扩展(末尾没有 i 的旧扩展是过时的!),您可以通过传递 @987654326 创建持久连接@ 作为创建实例时主机名的前缀:

mysqli::__construct

如果你真的在使用旧的 MySQL 扩展,有 mysql_pconnect 用于持久连接


或者,如果您使用 PDO,则可以使用 setAttribute() 来使用 PDO::ATTR_PERSISTENT

PDO 中有关使用持久连接的文档。

【讨论】:

  • 看起来有人花时间为你们俩投票报仇?
  • 我赞成你的回答。现在的PDO是正确的方法吗?我会测试它。
  • @SebastianOberste-Vorth 例如见this question。主要方面是您可以将不同的 RDBMS 与 PDO 一起使用。
  • @ComFreek 那是 PDO 的一部分,实际上被高估了恕我直言。它是命名参数和更好的 API。如果您切换 RDBMS,则必须以任何一种方式更改查询。
  • @SebastianOberste-Vorth 是的,所有mysql_* 都已被弃用。发reading of this详细了解原因。
【解决方案2】:

您可以使您的连接保持持久(对于 PDO,请使用 PDO::ATTR_PERSISTENT => true),但我的建议是找出您的脚本花费大量时间连接到 mysql 的原因并在那里进行一些改进。

考虑一下:

  • 使用 MySQL 服务器 IP 而不是主机名,以消除解析 dns 所需的时间。
  • 禁用mysql自动补全:(评论skip-auto-rehash来自my.cnf
  • 如果您进行大量查询,这些查询会一遍又一遍地返回相同的内容,请考虑使用缓存系统来缓存查询结果。
  • codereview.stackexchange.com 上发布您的代码,以便从其他专业知识中受益,进一步改进您的代码。
  • 为了进一步调试问题,从控制台连接到 MySQL 服务器并检查打开连接、更改数据库、选择等所需的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2012-02-06
    • 2012-09-11
    • 2021-01-24
    • 2020-04-30
    • 2014-11-02
    相关资源
    最近更新 更多