【问题标题】:MYSQLi error: User already has more than 'max_user_connections' active connections [duplicate]MYSQLi错误:用户已经有超过'max_user_connections'的活动连接[重复]
【发布时间】:2011-05-04 00:46:56
【问题描述】:

我正在运行的网站上出现以下错误。我不明白为什么会这样,因为它在我的本地主机上运行良好。跟楼主有关系吗?我在 Unix 服务器上。

Warning: mysqli::mysqli() [mysqli.mysqli]: (42000/1203): User dbo343879423 already has more than 'max_user_connections' active connections in /homepages/9/d322397966/htdocs/dump/models/class_database.php on line 11
Connect failed: User dbo343879423 already has more than 'max_user_connections' active connections 
Warning: mysqli::close() [mysqli.close]: Couldn't fetch mysqli in /homepages/9/d322397966/htdocs/dump/models/class_database.php on line 160

错误显示“用户 dbo343879423 在第 11 行的 /homepages/9/d322397966/htdocs/dump/models/class_database.php 中已经有超过 'max_user_connections' 的活动连接”,所以这是脚本中的第 11 行 -我看不出有什么不对!

$this -> connection = new mysqli($hostname,$username,$password,$database);

下面是class_database.php中的整个类,是不是脚本其他部分错了,我应该改一下?

<?php
#connects the database and handling the result
class __database {

    protected $connection = null;
    protected $error = null;

    #make a connection
    public function __construct($hostname,$username,$password,$database)
    {
        $this -> connection = new mysqli($hostname,$username,$password,$database);

        if (mysqli_connect_errno()) 
        {
            printf("Connect failed: %s\n", mysqli_connect_error());
            exit();
        }
    }

    #fetches all result rows as an associative array, a numeric array, or both
    public function fetch_all($query) 
    {
        $result = $this -> connection -> query($query);
        if($result) 
        {
            return $result -> fetch_all(MYSQLI_ASSOC);
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }
    }

    #fetches a result row as an associative array, a numeric array, or both
    public function fetch_assoc_while($query)
    {
        $result = $this -> connection -> query($query);
        if($result) 
        {
            while($row = $result -> fetch_assoc())
            {
                $return_this[] = $row;
            }

            if (isset($return_this))
            {
                return $return_this;
            }
            else
            {
                return false;
            }
        }
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }
    }

    #fetch a result row as an associative array
    public function fetch_assoc($query)
    {
        $result = $this -> connection -> query($query);
        if($result) 
        {
            return $result -> fetch_assoc();
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }
    }

    #get a result row as an enumerated array
    public function fetch_row($query)
    {
        $result = $this -> connection -> query($query);
        if($result) 
        {
            return $result -> fetch_row();
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }
    }

    #get the number of rows in a result
    public function num_rows($query)
    {
        $result = $this -> connection -> query($query);
        if($result) 
        {
            return $result -> num_rows;
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }
    }

    #performs a query on the database
    public function query($query)
    {
        $result = $this -> connection -> query($query); 
        if($result) 
        {
            return $result;
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }

    }

    #escapes special characters in a string for use in a SQL statement, taking into account the current charset of the connection
    public function real_escape_string($string)
    {
        $result = $this -> connection -> real_escape_string($string);   
        if($result) 
        {
            return $result;
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }

    }

    #display error
    public function get_error() 
    {
        return $this -> error;
    }

    #closes the database connection when object is destroyed.
    public function __destruct()
    {
        $this -> connection -> close();
    }
}
?>

还是我应该永远更换主机!??

下面是数据库连接类的实现。如果我把这部分去掉,错误就不会再出现了,但我在网站的其他部分也这样做,它们不会造成任何问题!

<!-- side-video-library -->
<div id="side-video-library" class="round-corner">

    <h4><a href="<?php echo HTTP_ROOT;?>videos"><span>ENER VIDEO LIBRARY</span></a></h4>

    <?php
    $sql = "
    SELECT *
    FROM root_pages

    WHERE root_pages.parent_id = '8'
    AND root_pages.pg_highlight = '1'
    AND root_pages.pg_hide != '1'
    ORDER BY rand() DESC
    LIMIT 1
    ";

    #instantiate the object of __database class
    $object_item = new __database(DB_HOST,DB_USER,DB_PASS,DB_NAME);
    $item = $object_item -> fetch_assoc($sql);

    #instantiate the object of __database class
    $object_item_num = new __database(DB_HOST,DB_USER,DB_PASS,DB_NAME);
    $total_item = $object_item_num -> num_rows($sql);
    //echo $total_item;
    ?>

    <?php
    if ($total_item > 0)
    {
        $sql = "
        SELECT *
        FROM root_tagged

        LEFT JOIN root_tags ON ( root_tags.tag_id = root_tagged.tag_id )

        WHERE root_tagged.pg_id = '".$item['pg_id']."'
        ";

        #instantiate the object of __database class
        $object_tagname = new __database(DB_HOST,DB_USER,DB_PASS,DB_NAME);
        $item_tagname = $object_tagname -> fetch_assoc($sql);

        #instantiate the object of __database class
        $object_tagname_num = new __database(DB_HOST,DB_USER,DB_PASS,DB_NAME);
        $total_tagname = $object_tagname_num -> num_rows($sql);
    ?>
    <p class="item-video">
        <object style="width: 183px; height: 151px;" width="183" height="151" data="http://www.youtube.com/v/<?php echo get_video_id($item['pg_content_1']) ;?>" type="application/x-shockwave-flash">
            <param name="wmode" value="transparent" />
            <param name="src" value="http://www.youtube.com/v/<?php echo get_video_id($item['pg_content_1']) ;?>" />
        </object>
    </p>

    <h3><a href="<?php echo HTTP_ROOT.str_replace(' ', '-', 'videos').'/'.$item_tagname['tag_name'].'/'.str_replace(' ', '-', strtolower($item['pg_url']));?>"><?php if(strlen($item['pg_title']) > 20) echo substr($item['pg_title'], 0,20).'...'; else echo $item['pg_title'];?></a></h3>

    <p class="item-excerpt-video"><?php if(strlen($item['pg_content_2']) > 100) echo substr($item['pg_content_2'], 0,100).'...'; else echo $item['pg_content_2'];?></p>
    <a href="<?php echo HTTP_ROOT;?>videos" class="button-arrow"><span>More</span></a>
    <?php
    }
    ?>
</div>
<!-- side-video-library -->

我是不是错误地实现了这个类??

谢谢。

【问题讨论】:

  • 您的主机使用的是什么版本的 PHP?仅 PHP5 起支持析构函数
  • 我对 GC 没有信心......使用完类后手动调用 destruct
  • 这与假设的重复不是同一个问题,尤其是当一些解决方案讨论增加可用的潜在活动连接时。

标签: php mysql error-handling mysqli


【解决方案1】:

问题可能是您只允许少数几个连接,而当您的班级尝试建立新连接时,您会遇到此错误。

这不是编程问题,只是可用资源的数量。并且使用此类的任何其他脚本都可能出现错误。

您必须在服务器上的 mysql 配置文件中配置更多连接。如果您没有此访​​问权限,请请求支持人员执行此操作或更改为允许更多连接的托管公司!

另一种选择是在这个类上实现一个单例模式,这样它就可以重用相同的连接池,并且不会超出限制。

【讨论】:

  • 感谢您的回复。我如何“在这个类上实现一个单例模式,所以它重用相同的连接池,并且不爆炸限制”?谢谢!
  • 看看odi.ch/prog/design/singleton.php如何实现。另一方面,周围有很多 PHP 连接池
【解决方案2】:

检查用户的 MySQL 服务器上的 MAX USER_CONNECTIONS 设置。在 PHPMyAdmin 中转到服务器页面(单击服务器:)并在子菜单中单击权限。编辑用户 dbo343879423,MAX USER_CONNECTIONS 将位于右侧。默认情况下,我相信它设置为 0(无限制),您的可能会受到限制,具体取决于谁设置了服务器。

我不确定您的 Database 类是如何使用的,但如果您要多次实例化该类,请考虑在数据库类中创建一个私有静态变量 Database 并创建一个公共静态方法 getDatabase() 来实例化数据库连接,如果它为空并返回实例。

【讨论】:

  • 您好,感谢您的回复。我刚刚在上面编辑了我的 OP 线程,添加了我如何使用数据库连接类的部分——我是不是练习不正确?谢谢
【解决方案3】:

如果您收到此 max_user_connections 消息,请先优化您的数据库表。

如何优化数据库表和查询​​:

  1. 在 mysql 中索引表字段
  2. 在选择查询中删除 `*` 并写下您需要的字段
  3. 关闭mysql_connection

【讨论】:

  • 也可以在my.cnf中设置值:[mysqld] max_connections = 500 max_user_connections = 200
  • 您能解释一下为什么我们需要首先优化数据库表吗??
【解决方案4】:

为了它的价值,我想包括由于占位符不正确而收到此消息的情况:

      $sql_str = 'SELECT prod_id FROM ' . $this->table_name["product"] . ' WHERE prod_sku =:p_sku';
    $arr[':prod_sku'] = $s_sku;

此外,我还进行了大量查询。我怀疑错误加上大量查询导致了这个问题。当我修复查询时,离开时的连接问题。

【讨论】:

  • 我做了更多的测试。我的观察是 PDO 似乎不太容忍许多连续的连接 - 即在循环中创建连接。我首先知道这是不好的做法。当我使用 mysql_* 时,我的循环查询似乎相当快。但是,当我切换到 PDO 时,我注意到这些类型的查询的响应时间要长得多。 TL;博士; - 如果切换到 PDO 并在 PHP 循环中调用查询,则可能需要重写应用程序以调用单个查询而不是多个连续查询。
【解决方案5】:

在 Godaddy 共享主机上,您不能更改 MAX_USER_CONNECTION 值。要找到它,请单击服务器,然后单击菜单栏中的变量。我的设置为 200。

【讨论】:

  • 我也尝试通过Variables 编辑该字段,但遇到#1227 - Access denied 错误。你知道如何解决这个问题吗?
【解决方案6】:

使用命令行检查登录到mysql的连接数并运行此命令

SHOW VARIABLES LIKE 'max_user_connections'

第 1 步:查看 /etc/my.cnf 中的设置

max_user_connections = <set number that you want>

max_user_connections =

你也可以从mysql命令行设置

SET GLOBAL max_user_connections = 0;

重启你的apache服务器

【讨论】:

    猜你喜欢
    • 2012-07-01
    • 2014-06-14
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 2014-05-20
    • 2016-08-01
    相关资源
    最近更新 更多