搜索

首页  >  问答  >  正文

php操作数据库的连接与释放怎样做比较好?

在手册中,每个查询完成后,都会关闭连接。那么当有多个数据库操作的时候这样就导致不停的生成与释放连接,是不是不合理?

比如,有一个a.php,里面有20个函数,分别要实例化20个对象,每个对象中都有数据库操作。

那么,有三种方法:
1.在20个对象的每个类中分别获得一个数据库连接,操作完成并关闭。
2.在a.php中获得数据库连接,在每个函数中,把连接传参进去,最终在a.php释放。
3.生成一个静态的数据库连接对象,每个类中调用ConnectionClass::db

怎么样比较好,请大家讨论讨论。


阿神阿神3065 天前1254

全部回复(2)我来回复

  • 汪汪

    汪汪2016-11-09 17:28:20

    用一个静态变量保存数据库连接就可以实现在一个请求中多个函数只连接一次数据库了.
    如果再开启持久连接,就可以实现一个PHP-FPM进程在多次请求中共享一个数据库连接了.

    2544059839-55f97e541d693_articlex.png

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    <!--?php

    function db() {

        static $db; //静态变量

        if ($db) {

            return $db;

        } else {

            $db = new mysqli('p:127.0.0.1','user','pass','dbname',3306);

            return $db;

        }

    }

    function foo1() {

        return db()--->query('SELECT * FROM table1')->fetch_all();

    }

    function foo2() {

        return db()->query('SELECT * FROM table2')->fetch_all();

    }

    var_export( foo1() );

    var_export( foo2() );

    下面两次函数调用返回结果都是一样的,可见$db被第一次赋值后,第二次不会再去执行else里的分支,也就不会再生成一个uniqid数.

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    <!--?php

    header('Content-Type: text/plain; charset=utf-8');

    function db() {

        static $db; //静态变量

        if ($db) { return $db; } 

        else { $db = uniqid(mt_rand(), true); return $db; }

    }

    function foo1() { return db(); }

    function foo2() { return db(); }

    echo foo1()."\n";

    echo foo2()."\n";</pre--><p><br></p><p></p><span class="detail_answer2" style="float: left" fid="1741"><div class="btn wenda-second-btn" name="汪汪" fid="1741">回复</div></span><i class="layui-icon layui-icon-praise wenda-praise-btn"><span>0</span></i>

  • 学习ing

    学习ing2016-11-09 17:26:10

    其他数据库我不清楚,MySQL是支持持久化连接的。
    持续连接不会关闭之前的数据库连接,下一次连接时直接使用之前的连接。

    MySQLi:并没有类似MySQL的pconnect()函数,但你可以连接时在主机名前增加p:,参考PHP官网:mysqli扩展和持久化连接。

    不像mysql扩展,mysqli没有提供一个特殊的方法用于打开持久化连接。需要打开一个持久化连接时,你必须在 连接时在主机名前增加p:。

    PDO也支持长连接:在new PDO的第4个参数中使用array(PDO::ATTR_PERSISTENT),参考PHP官方手册 —— PDO 连接与连接管理 Example4。


    回复
    0
  • 取消回复