【问题标题】:PHP - Best way to connect to database when there are multiple connectionsPHP - 当有多个连接时连接到数据库的最佳方式
【发布时间】:2013-08-06 21:10:26
【问题描述】:

我最近刚刚获得了一个中型项目的服务方面。这位前开发人员将他的所有函数作为单独的 php 脚本而不是类(func1.php、func2.php 等)......所有这些“函数”都通过引用实际来引用 mysqli_connect 'databaseonnection.php' 文件。每次运行任何脚本时(每次我必须调用函数)都会创建一个新连接,我不想这样做。我一直在考虑建立持久连接,但我担心随着项目每天都在增长,它会失控。那么,有没有人遇到过类似的情况呢?处理与数据库的连接的最佳方法是什么?任何建议将不胜感激。

【问题讨论】:

  • mysql_* 函数已弃用。使用PDOmysqli
  • 原始方法听起来很“正常”,您确定您知道您建议的更改的含义吗?
  • @Dagon 我不想每次必须调用函数时都打开新连接...
  • 这很正常,连接器被重复使用。我担心如果你想要的不是正常的练习,你需要明白为什么。
  • 持久连接对于 php 脚本来说通常是个坏主意。很容易让自己陷入数据库死锁的境地。

标签: php mysql mysql-connect


【解决方案1】:

来自mysql_connect 的文档。如果使用相同的参数对 mysql_connect() 进行第二次调用,则不会建立新链接,而是返回已打开链接的链接标识符。

【讨论】:

  • 谢谢。这超出了我的想象!
  • 请记住,mysql_connect() 自 php 版本 5.5.0 起已贬值,并在版本 7.0.0 中被删除。请改用mysqli_connect()
【解决方案2】:

编辑:很抱歉,我以为您需要连接帮助。除了将所有这些“功能”移到一个文件中,别无他法。

我创建了一个 con.php 文件,在其中建立了我的 PDO 连接,然后将该文件包含在您希望使用连接的任何位置这是 PDO 连接的基础:

$PDO = new PDO("mysql:host=localhost;dbname=dbname", "user_name", "password");

这是我关于使用 PDO 对象进行准备查询的笔记。下面的内容超出了您的需要,但祝您好运。

在需要连接的 PHP 文件中: 1:包括('con.php');

2:  $datas = $PDO->prepare(SELECT * FROM table WHERE title LIKE :searchquery);
    // prepare method creates and returns a PDOstatment object ( print_r($datas); ) which contains an execute() method
    // PDOstatment object has its own methods ie. rowCount()

    // $datas->bindValue(':search', '% . $search . %', )
    // Optional - Manually bind value. see http://php.net/manual/en/pdostatement.bindparam.php

3: $datas->execute( array(':searchquery' => $searchquery . '%'));
    // pass in values that need to be bound AND EXECUTE.

    // There are 17 ways to "fetch" data with the PDO object.
4: $datas-fetchALL(PDO::FETCH_OBJ);

通过句柄关闭一个 pdo 连接:

$PDO = null;

【讨论】:

  • 是的,但是你必须重新设计整个项目,除非你要使用非常过时的数据库连接功能。
【解决方案3】:

我认为使用 PDO 会比使用旧的 MYSQL 功能更好,例如mysql_connect。它的界面更加健壮。

以下是执行此操作的基本代码:

$db_handle = new PDO("mysql:host=".$db_host.";dbname=".$db_name.";port=".$db_port."", $db_username, $db_password, $connect_options);

其中$db_handle是代表数据库连接的PDO对象,$db_host是你的主机名[通常是localhost],$db_name是你的数据库名,$db_port是数据库端口号[通常是3306], $db_username$db_password 是您的数据库用户访问凭据,$connect_options 是可选的特定于驱动程序的连接选项。

要启用持久连接,您需要在打开连接之前为其设置特定于驱动程序的连接选项:$connect_options = array(PDO::ATTR_PERSISTENT => true); 然后执行之前的数据库连接代码。

您可以从此处的 PHP 文档获得更多信息:http://www.php.net/manual/en/pdo.construct.phphttp://php.net/manual/en/pdo.connections.php

关于创建持久连接,我建议您通过取消您的数据库句柄$db_handle = NULL; 来关闭您在脚本末尾打开的每个数据库连接(当然是在所有数据库操作之后)。无论您是否打开了持久连接,都应该这样做。这听起来违反直觉,但我相信您应该在脚本完成后释放所有数据库资源。

[根据我的经验] 这样做的性能劣势对于大多数应用程序来说可以忽略不计。这显然是一个有争议的断言,您可能还会发现以下链接有助于进一步阐明您在这方面的策略:

Persistent DB Connections - Yea or Nay?

编码愉快!

【讨论】:

    【解决方案4】:

    如果您有非常复杂的项目并且需要大量预算来重新设计,并且更喜欢非常简单的改动

    1) 留在mysqli_connect 2)将数据库连接移动到脚本的标题。 3) 删除该函数上的函数数据库 close()。 4)删除连接链接变量,单个数据库不需要。 5)关闭页脚末尾的数据库。

    通过这种方式,在启动脚本时建立数据库连接,并且在所有查询之后,它将在页脚关闭。您的服务器可以使用 keepalive 方法处理连接而无需关闭/重新打开。基本上默认的keepalive值是30到90秒。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多