2010-11-02 70 views
10

我在運行的網站上有下列錯誤。我不明白爲什麼,因爲它在我的本地主機上正常工作。這與主機有關嗎?我在Unix服務器上。MYSQLi錯誤:用戶已經有超過'max_user_connections'活動連接

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已經有超過‘MAX_USER_CONNECTIONS’在/homepages/9/d322397966/htdocs/dump/models/class_database.php上線11活動連接」,所以這是線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 --> 

我是不是正在實現類不正確?

謝謝。

+0

您的主機使用哪種版本的PHP?析構函數僅支持PHP5 – 2010-11-02 16:04:39

+0

它是PHP 5 ...謝謝! – laukok 2010-11-02 16:38:25

+0

我對GC的......沒有信心......在完成使用類 – 2010-11-02 19:27:53

回答

7

可能問題是你只有少數連接允許,當你的班級嘗試獲得新的連接時,你有這個錯誤。

這不是一個編程問題,只是可用的資源數量。而任何其他使用這個類的腳本都會有錯誤。

您必須在服務器上的mysql配置文件上配置更多連接。如果您沒有此訪​​問權限,請要求支持人員執行此操作,或者更改爲託管公司,並允許更多連接!

其他選項是在這個類上實現一個Singleton模式,所以它重用了相同的連接池,並且不會破壞限制。

+0

的感謝回覆後,用手調用破壞。我該如何'在這個類上實現Singleton模式,因此它重用了同一個連接池,並且不會破壞這個限制'?謝謝! – laukok 2010-11-02 16:14:40

+0

查看http://www.odi.ch/prog/design/singleton.php關於如何實現。另一方面,有大量的PHP連接池圍繞 – 2010-11-02 19:33:49

3

檢查用戶的MySQL服務器上的MAX USER_CONNECTIONS設置。在PHPMyAdmin中,進入服務器頁面(點擊服務器:<>)並在子菜單中點擊特權。編輯用戶dbo343879423,MAX USER_CONNECTIONS將在右側。默認情況下,我認爲它設置爲0(無限制),但根據服務器的設置,您可能受到限制。

我不知道如何使用您的數據庫類,但是如果您多次實例化類,請考慮在數據庫類中創建一個私有靜態變量數據庫並創建一個公共靜態方法getDatabase(),它實例化數據庫連接如果它爲空並返回實例。

+0

嗨感謝您的答覆。我剛纔編輯了我的OP線程,在我如何使用數據庫連接類的地方添加了 - 我是否在錯誤地練習它?謝謝 – laukok 2010-11-02 16:21:40

5

如果您收到此max_user_connections消息,請首先優化您的數據庫表。

如何優化數據庫表和查詢​​:

  1. 指數你在MySQL
  2. 在選擇查詢刪除`*`表字段,寫你需要現場
  3. 封閉mysql_connection
+0

您還可以設置my.cnf中的值: [mysqld] max_connections = 500 max_user_connections = 200 – 2012-11-27 13:02:18

1

對於我想要包含的情況,我遇到了一個情況,我遇到了由於佔位符不正確而收到此消息的地方:

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

另外我在做大量的查詢。我懷疑與大量查詢相關的錯誤導致了這個問題。當我解決查詢時,連接問題離開時。

+0

我做了一些測試。我的觀察是,PDO似乎不太容忍許多連續的連接 - 即連接在循環中創建。我知道這是不好的做法,它是第一個地方。當我使用mysql_ *時,我的循環查詢似乎相當快。但是,當我切換到PDO時,我注意到這些類型的查詢的響應時間更長。 TL; DR; - 如果切換到PDO,並且您在PHP循環中調用查詢,則可能需要重寫應用程序以調用一個查詢而不是多個連續的查詢。 – Tycon 2014-10-10 01:49:15

1

對於Godaddy共享主機上的這個,您不能更改MAX_USER_CONNECTION值。要找到它,請單擊服務器<>,然後單擊菜單欄中的變量。我的設置爲200.