PHP»Singleton MySQL连接

时间:2012-02-26 19:08:00

标签: php mysql singleton

以下函数是MySQL连接的旧方法

function dbconn($autoclean = false, $mysql_close = false)
{
    global $mysql_host, $mysql_user, $mysql_pass, $mysql_db;
    mysql_connect($mysql_host, $mysql_user, $mysql_pass);
    mysql_select_db($mysql_db);

    userlogin();

    if ($autoclean)
        register_shutdown_function("autoclean");

    if ($mysql_close)
        register_shutdown_function("mysql_close");
}

嗯......我的专用服务器已经报告了这个问题,比如“使用Singleton因为你发送垃圾邮件的mysql连接”,所以我为MySQL编写了一个单例类,但垃圾邮件仍在那里。

<?php
    class mysql {
        private static $instance;
        private $res;
        private function __construct() 
        {
            $this->res = mysql_connect('localhost','user','password');
            mysql_select_db('database', $this->res);
        }
        public static function getinstance() {
            if(!isset(self::$instance)) {
                $c = __CLASS__;
                self::$instance = new $c;
            }
            return self::$instance;
        }
        public function getres() {
            return $this->res;
        }
    }
?>

和功能......

function dbconn($autoclean = false, $mysql_close = false, $file = '')
{
    require_once("MySQL.php");
    $m = mysql::getinstance();
    $m->getres();

    userlogin();

    if ($autoclean)
        register_shutdown_function("autoclean");

    //if ($mysql_close)
    //  register_shutdown_function("mysql_close");
}

谢谢!

3 个答案:

答案 0 :(得分:1)

Singleton将仅持续单个访问者的单个HTTP请求的长度,然后将被清除 - 除非您进行一些缓存。因此,您的连接垃圾邮件似乎是按请求进行的。您想要的是某种连接池,如下所述:Connection pooling in PHP

答案 1 :(得分:1)

请注意,这仍会为每个请求打开一个连接。如果您的站点很流行并且服务器运行缓慢且配置错误,则可能会导致大量并发连接并进一步阻塞数据库。在这种情况下,我只能建议更换服务器或托管服务商)

当然,您的查询也可能很慢,这可能会导致MySQL过载。如果您的网站确实很受欢迎。

答案 2 :(得分:0)

我从来没有听说过发送过mysql连接的垃圾邮件&#39;。您可能在有限的可用连接池中使用了大量的mysql连接。

在这种情况下,persistent MySQL connections可能会有所帮助。

但请read the manual regarding mysql_pconnect!文档中的这一提示并不是唯一的缺陷:

&#39;请注意,这些链接仅在您使用PHP的模块版本时才有效。有关详细信息,请参阅“持久性数据库连接”部分。&#39;

&#39;持久连接旨在与常规连接进行一对一映射。这意味着您应始终能够用非持久连接替换持久连接,并且它不会改变脚本的行为方式。 可能(可能会)改变脚本的效率,但不改变其行为!&#39;

错误使用,垃圾邮件&#39;问题变得更大......