2010-11-02 7 views
10

Tengo este error debajo en un sitio que estoy ejecutando. No entiendo por qué es así, ya que funciona bien en mi servidor local. ¿Tiene algo que ver con el anfitrión? Estoy en un servidor Unix.Error de MYSQLi: el usuario ya tiene más conexiones activas de '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 

el error dice 'dbo343879423 usuario ya tiene más de '' conexiones activas en /homepages/9/d322397966/htdocs/dump/models/class_database.php en la línea 11' max_user_connections, por lo que esta es la línea 11 en el guión: ¡no veo nada malo!

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

a continuación es la clase entera en class_database.php, ¿es malo en otra parte del guión y que debería cambiar?

<?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 debería simplemente cambiar el host para siempre! ??

a continuación es la implementación de la clase de conexión de la base de datos. Si quito esta parte, el error ya no aparecerá, pero también hago lo mismo en otras partes del sitio y ¡no causarán ningún 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 --> 

¿He estado implementando la clase incorrectamente?

gracias.

+0

¿qué versión de PHP está usando su host? Los destructores solo son compatibles a partir de PHP5 –

+0

, es PHP 5 ... ¡gracias! – laukok

+0

No confío en GC ... invocar destrucción manual cuando termine de usar la clase –

Respuesta

7

Probablemente el problema es que solo tiene un puñado de conexiones permitidas y cuando su clase intenta obtener una nueva conexión, tiene este error.

Esto no es un problema de programación, solo la cantidad de recursos disponibles. Y cualquier otro script que use esta clase está sujeto a tener el error.

Tiene que configurar más conexiones en el archivo de configuración de mysql en el servidor. Si no tiene este acceso, solicite al soporte que lo haga o cambie por una empresa de hosting con más conexiones permitidas.

Otra opción es implementar un patrón Singleton en esta clase, por lo que reutiliza el mismo conjunto de conexiones, y no explota el límite.

+0

gracias por la respuesta. ¿Cómo puedo 'implementar un patrón Singleton en esta clase, por lo que reutiliza el mismo conjunto de conexiones y no explota el límite'? ¡Gracias! – laukok

+0

Eche un vistazo a http://www.odi.ch/prog/design/singleton.php sobre cómo implementarlo. Por otro lado, hay un montón de grupos de PHP Connection alrededor de –

3

Compruebe la configuración MAX USER_CONNECTIONS en su servidor MySQL para el usuario. En PHPMyAdmin vaya a la página del servidor (haga clic en Servidor: <>) y en el submenú, haga clic en privilegios. Edite el usuario dbo343879423 y MAX USER_CONNECTIONS estará en el lado derecho. De manera predeterminada, creo que está configurado en 0 (ilimitado), el tuyo puede estar restringido dependiendo de quién configuró el servidor. No estoy seguro de cómo se utiliza su clase de base de datos, pero si crea varias veces la clase considere crear una base de datos estática privada en la clase de base de datos y crear un método público estático getDatabase() que ejemplifique la conexión a la base de datos si es nulo y devuelve la instancia.

+0

hola gracias por la respuesta. Acabo de editar mi hilo OP arriba, agregando la parte donde uso la clase de conexión a la base de datos, ¿lo he estado practicando incorrectamente? gracias – laukok

5

Si obtiene este mensaje max_user_connections, primero optimice la tabla de su base de datos.

Cómo optimizar la tabla de base de datos y consulta:

  1. Índice de su campo de tabla en MySQL
  2. En seleccione Quitar consulta `*` y escribir lo que necesita el campo
  3. mysql_connection cerrado
+0

También puede establecer los valores en my.cnf: [mysqld] max_connections = 500 max_user_connections = 200 –

1

Por lo que vale, quería incluir una situación en la que me encontré y recibí este mensaje debido a un marcador de posición incorrecto:

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

Además, estaba haciendo una gran cantidad de consultas. Sospecho que el error se agravó con la gran cantidad de consultas que causó este problema. Cuando arreglé la consulta, las conexiones se emiten cuando están fuera.

+0

Hice un poco más de prueba. Mi observación es que PDO parece ser menos tolerante con muchas conexiones consecutivas, es decir, que las conexiones se crean en un bucle. Sé que esta es una mala práctica, es el primer lugar. Cuando estaba usando mysql_ *, mis consultas en bucle parecían ser bastante rápidas. Sin embargo, cuando cambié a PDO noté tiempos de respuesta mucho más largos para este tipo de consultas. TL; DR; - Si cambia a PDO y llama consultas en un bucle de PHP, puede necesitar volver a escribir la aplicación para llamar a una única consulta en lugar de a muchas consultas consecutivas. – Tycon

1

Para esto en alojamiento compartido Godaddy, no puede cambiar el valor MAX_USER_CONNECTION. Para encontrarlo, haga clic en Servidor <>, luego haga clic en Variables en la barra de menú. El mío está configurado en 200.

Cuestiones relacionadas