2010-11-02 15 views
10

Tôi gặp lỗi này bên dưới trên trang web tôi đang chạy. Tôi không hiểu tại sao là vì nó hoạt động tốt trên localhost của tôi. Có liên quan gì với chủ nhà không? Tôi đang trên một máy chủ Unix.Lỗi MYSQLi: Người dùng đã có nhiều hơn 'kết nối hoạt động' 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 

lỗi nói 'tài dbo343879423 đã có hơn '' kết nối tích cực trong /homepages/9/d322397966/htdocs/dump/models/class_database.php trên đường dây 11' max_user_connections, vì vậy đây là dòng 11 trong kịch bản - Tôi không thấy gì sai cả!

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

dưới đây là toàn bộ lớp trong class_database.php, có sai ở phần khác của tập lệnh và tôi nên thay đổi không?

<?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(); 
    } 
} 
?> 

hoặc tôi chỉ cần thay đổi máy chủ cho tốt! ??

dưới đây là việc triển khai lớp kết nối cơ sở dữ liệu. Nếu tôi thực hiện phần này, lỗi sẽ không xuất hiện nữa, nhưng tôi cũng làm như vậy ở các phần khác của trang web và chúng sẽ không gây ra bất kỳ sự cố nào!

<!-- 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 --> 

Tôi đã triển khai lớp học không chính xác chưa ??

cảm ơn.

+0

Máy chủ của bạn sử dụng phiên bản PHP nào? Destructors chỉ được hỗ trợ như của PHP5 –

+0

đó là PHP 5 ... cảm ơn! – laukok

+0

Tôi không tự tin về GC ... gọi phá hủy bằng tay khi hoàn thành bằng cách sử dụng các lớp học –

Trả lời

7

Có thể vấn đề là bạn chỉ có một số kết nối được cho phép và khi lớp học của bạn tìm cách nhận kết nối mới, bạn có lỗi này.

Đây không phải là vấn đề lập trình, chỉ số lượng tài nguyên có sẵn. Và bất kỳ tập lệnh nào khác sử dụng lớp này đều có lỗi.

Bạn phải định cấu hình nhiều kết nối hơn trên tệp cấu hình mysql trên máy chủ. Nếu bạn không có quyền truy cập này, hãy yêu cầu hỗ trợ để thực hiện hoặc thay đổi công ty lưu trữ có nhiều kết nối hơn được phép!

Tùy chọn khác là triển khai mẫu Singleton trên lớp này, vì vậy nó tái sử dụng cùng một nhóm kết nối và không phát nổ giới hạn.

+0

cảm ơn cho trả lời. làm thế nào để tôi thực hiện một mẫu Singleton trên lớp này, vì vậy nó tái sử dụng cùng một nhóm các kết nối, và không phát nổ giới hạn '? cảm ơn! – laukok

+0

Hãy xem http://www.odi.ch/prog/design/singleton.php về cách triển khai. Mặt khác, có rất nhiều hồ bơi kết nối PHP xung quanh –

3

Kiểm tra cài đặt MAX USER_CONNECTIONS trên máy chủ MySQL của bạn cho người dùng. Trong PHPMyAdmin, hãy vào trang máy chủ (Nhấn vào máy chủ: <>) và trong menu phụ, nhấp vào các đặc quyền. Chỉnh sửa người dùng dbo343879423 và MAX USER_CONNECTIONS sẽ ở bên phải. Theo mặc định, tôi tin rằng nó được đặt thành 0 (không giới hạn), máy của bạn có thể bị hạn chế tùy thuộc vào người thiết lập máy chủ.

Tôi không biết lớp cơ sở dữ liệu của bạn đang được sử dụng như thế nào, nhưng nếu bạn đang khởi tạo lớp nhiều lần, hãy cân nhắc tạo cơ sở dữ liệu biến riêng tư trong lớp cơ sở dữ liệu và tạo phương thức tĩnh getDatabase(). nếu nó là null và trả về cá thể.

+0

xin cảm ơn vì đã trả lời. Tôi chỉ cần chỉnh sửa thread OP của tôi ở trên, thêm vào một phần mà làm thế nào tôi sử dụng lớp kết nối cơ sở dữ liệu - tôi đã thực hành nó không chính xác? cảm ơn – laukok

5

Nếu bạn nhận được thông báo max_user_connections này trước tiên hãy tối ưu hóa bảng cơ sở dữ liệu của bạn.

Làm thế nào để tối ưu hóa bảng cơ sở dữ liệu và truy vấn:

  1. Index lĩnh vực bảng trong mysql
  2. Trong chọn remove truy vấn `*` và viết mà bạn cần lĩnh vực
  3. Closed mysql_connection
+0

Bạn cũng có thể đặt các giá trị trong my.cnf: [mysqld] max_connections = 500 max_user_connections = 200 –

1

Đối với những gì giá trị của nó tôi muốn bao gồm một tình huống tôi chạy vào nơi tôi nhận được thông báo này do một trình giữ chỗ không chính xác:

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

Ngoài ra, tôi đã thực hiện một số lượng truy vấn lớn. Tôi nghi ngờ rằng lỗi phức tạp với số lượng lớn các truy vấn gây ra vấn đề này. Khi tôi cố định truy vấn các vấn đề kết nối khi đi.

+0

Tôi đã thử nghiệm nhiều hơn một chút. Quan sát của tôi là PDO dường như ít chịu đựng được nhiều kết nối liên tiếp - đó là các kết nối được tạo ra trong một vòng lặp. Tôi biết điều này là xấu thực hành nó là nơi đầu tiên. Khi tôi đang sử dụng mysql_ * các truy vấn lặp lại của tôi dường như khá nhanh. Tuy nhiên khi tôi chuyển sang PDO, tôi nhận thấy thời gian phản hồi dài hơn nhiều đối với các loại truy vấn này. TL; DR; - Nếu bạn chuyển sang PDO và bạn gọi các truy vấn trong vòng lặp PHP, bạn có thể cần phải viết lại ứng dụng để gọi một truy vấn đơn lẻ hơn là nhiều truy vấn liên tiếp. – Tycon

1

Đối với điều này trên Godaddy chia sẻ lưu trữ, bạn không thể thay đổi giá trị MAX_USER_CONNECTION. Để tìm nó, nhấp vào Máy chủ <>, sau đó nhấp vào Biến trong thanh menu. Mỏ được đặt thành 200.

Các vấn đề liên quan