如何在php单例类中关闭PDO连接

时间:2015-02-27 09:08:36

标签: php pdo singleton

我有一个PDO的单例类,下面是类的相关部分

    public static function getInstance( $config )
            {
                if ( ! isset(self::$instance))
                    self::$instance = new self( $config );

                return self::$instance;
            }

            public  function __construct( $config )
            {
                self::$start        =   self::timer();

                try
                {
                    $host       =   $config['host'];
                    $dbname     =   $config['name'];
                    $user       =   $config['user'];
                    $password   =   $config['password'];

                    self::$objInstance  =   new PDO("mysql:host=$host;dbname=$dbname;charset=utf8",
                                                    "$user",
                                                    "$password",
                                                    array(PDO::ATTR_PERSISTENT => true)
                                                );

                    self::$objInstance -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
                }
                catch (PDOException $e)
                {
                    //need to log for security
                    die('PDO CONNECTION ERROR: ' . $e->getMessage() . '<br/>');
                }

            }

public static function closeConnection ( )
        {
            try
            {
                self::$objInstance      =   null;
            }
            catch (PDOException $e)
            {
                //OPTIMIZE**************************** to do
                //file_put_contents("log/dberror.log", "Date: " . date('M j Y - G:i:s') . " ---- Error: " . $e->getMessage().PHP_EOL, FILE_APPEND);

                die($e->getMessage());
            }

            self::$end  =   self::timer();

        }

所以这里一切正常,但是当我在任何数据库操作之后调用静态closeConnection()时,它会使PDO实例为空,这很好但是再次调用PDO实例会产生错误,因为PDO现在为空调用closeconnection。我的问题是如何处理在单件类中关闭PDO?

2 个答案:

答案 0 :(得分:1)

更改

self::$objInstance      =   null;

self::$instance = null;

因为您尝试删除PDO对象而不是单例对象。

答案 1 :(得分:0)

来自the documentation

  

成功连接数据库后,PDO的一个实例   class返回到您的脚本。连接仍然有效   该PDO对象的生命周期。要关闭连接,您需要   通过确保对它的所有剩余引用来销毁对象   已删除 - 您可以通过将NULL分配给包含该变量的变量来执行此操作   宾语。 如果您没有明确地执行此操作,PHP将自动关闭   脚本结束时的连接。

使用单身人士,连接的整个生命周期应该由单身人士自己控制。因此,我将依赖于记录的自动关闭连接,而不是公开一个方法来完全关闭连接(出于同样的原因,不应该暴露构造函数)。