2010-11-02 9 views
10

Ho questo errore qui sotto su un sito che sto utilizzando. Non capisco perché è così come funziona bene sul mio localhost. Ha qualcosa a che fare con l'ospite? Sono su un server Unix.Errore MYSQLi: l'utente ha già più di connessioni attive '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'errore dice 'dbo343879423 utente ha già più di '' connessioni attive in /homepages/9/d322397966/htdocs/dump/models/class_database.php sulla linea 11' max_user_connections, quindi questa è la linea 11 nella sceneggiatura - Non riesco a vedere niente di sbagliato!

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

di seguito è l'intera classe in class_database.php, è sbagliato in altra parte dello script e dovrei cambiare?

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

o devo solo cambiare l'host per sempre! ??

di seguito è l'implementazione della classe di connessione al database. Se tengo fuori questa parte, l'errore non apparirà più, ma faccio lo stesso anche in altre parti del sito e non causeranno alcun problema!

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

Ho eseguito la classe in modo errato?

grazie.

+0

quale versione di PHP utilizza l'host? I distruttori sono supportati solo da PHP5 –

+0

è PHP 5 ... grazie! – laukok

+0

Non sono sicuro che GC ... invochi la distruzione a mano una volta finito di usare la classe –

risposta

7

Probabilmente il problema è che sono consentite solo una manciata di connessioni e quando la classe tenta di ottenere una nuova connessione si ha questo errore.

Questo non è un problema di programmazione, solo una quantità di risorse disponibili. E ogni altro script che usa questa classe è soggetto ad avere l'errore.

È necessario configurare più connessioni sul file di configurazione mysql sul server. Se non si dispone di questo accesso, chiedere al supporto di farlo o cambiare per una società di hosting con più connessioni consentite!

Un'altra opzione consiste nell'implementare un modello Singleton su questa classe, quindi riutilizza lo stesso pool di connessioni e non esplode il limite.

+0

grazie per la risposta. come posso implementare un pattern Singleton su questa classe, quindi riutilizza lo stesso pool di connessioni e non esplode il limite? Grazie! – laukok

+0

Dai un'occhiata a http://www.odi.ch/prog/design/singleton.php su come implementare. D'altra parte ci sono un sacco di piscine di connessione PHP intorno a –

3

Controllare l'impostazione MAX USER_CONNECTIONS sul server MySQL per l'utente. In PHPMyAdmin accedere alla pagina del server (fare clic sul server: <>) e nel sottomenu fare clic su privilegi. Modifica l'utente dbo343879423 e MAX USER_CONNECTIONS sarà sul lato destro. Per impostazione predefinita, credo che sia impostato su 0 (illimitato), il tuo forse limitato a seconda di chi ha configurato il server.

Non sono sicuro di come viene utilizzata la classe Database, ma se si crea un'istanza della classe più volte si consideri la creazione di una variabile statica privata Database nella classe del database e la creazione di un metodo statico pubblico getDatabase() che crea un'istanza della connessione al database se è nullo e restituisce l'istanza.

+0

Ciao, grazie per la risposta. Ho appena modificato il mio thread OP in alto, aggiungendo nella parte dove utilizzo la classe di connessione al database - l'ho praticato in modo errato ?? grazie – laukok

5

Se si ottiene questo messaggio max_user_connections, ottimizzare innanzitutto la tabella del database.

Come ottimizzare tabella del database e query:

  1. Indice tuo campo di tabella in MySQL
  2. In query di selezione remove `*` e scrivere che è necessario campo
  3. mysql_connection Closed
+0

Puoi anche impostare i valori in my.cnf: [mysqld] max_connections = 500 max_user_connections = 200 –

1

Per quale motivo volevo includere una situazione in cui mi sono imbattuto dove ho ricevuto questo messaggio a causa di un segnaposto non corretto:

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

Inoltre, stavo facendo un gran numero di domande. Sospetto che l'errore combinato con l'elevato numero di query abbia causato questo problema. Quando ho risolto la query, il problema con le connessioni è andato via.

+0

Ho eseguito un po 'più di test. La mia osservazione è che PDO sembra essere meno tollerato da molte connessioni consecutive - cioè le connessioni vengono create in un ciclo. So che questa è una cattiva pratica, è il primo posto. Quando stavo usando mysql_ * le mie query in loop sembravano essere abbastanza veloci. Tuttavia, quando sono passato a PDO ho notato tempi di risposta molto più lunghi per questi tipi di query. TL; DR; - Se si passa a PDO e si chiamano query in un loop PHP, potrebbe essere necessario riscrivere l'applicazione per chiamare una singola query piuttosto che molte query consecutive. – Tycon

1

Per questo su hosting condiviso Godaddy, non è possibile modificare il valore MAX_USER_CONNECTION. Per trovarlo, fai clic su Server <>, quindi fai clic su Variabili nella barra dei menu. Il mio è impostato su 200.

Problemi correlati