example ejemplos descargar create php mysql

ejemplos - php mysqli



La lista de procesos de MySql está llena de entradas "en espera" que llevan a "Demasiadas conexiones"? (4)

Así que estaba ejecutando 300 procesos PHP simultáneamente y obtenía una tasa de entre 60 y 90 por segundo (mi proceso involucra consultas 3x). Lo subí a 400 y esto cayó a alrededor de 40-50 por segundo. ¡Lo bajé a 200 y he vuelto a entre 60 y 90!

Así que mi consejo para cualquier persona con este problema es experimentar con correr menos que más y ver si mejora. Habrá menos memoria y CPU en uso, por lo que los procesos que se ejecutan tendrán mayor capacidad y la velocidad puede mejorar.

Me gustaría pedirle ayuda sobre un problema de larga data con las conexiones php / mysql.

Cada vez que ejecuto un comando "MOSTRAR PROCESO", me muestra aproximadamente 400 conexiones inactivas (Estado: inactivo) al servidor de base de datos que surge de nuestros 5 servidores web.

Eso nunca fue un gran problema (y no encontré una solución rápida) hasta que recientemente aumentaron los números de tráfico y, desde entonces, MySQL informa los problemas de "a muchas conexiones" repetidamente, aun así, más de 350 de esas conexiones están en estado de "suspensión" . Además, un servidor no puede obtener una conexión MySQL incluso si hay una conexión inactiva para ese mismo servidor.

Todas esas conexiones se desvanecen cuando se actualiza un servidor apache.

El código PHP utilizado para crear las conexiones de la base de datos utiliza el módulo "mysql" normal, el módulo "mysqli", PEAR :: DB y Zend Framework Db Adapter. (Diferentes proyectos). Ninguno de los proyectos utiliza conexiones persistentes.

Elevar el límite de conexión es posible pero no parece una buena solución, ya que ahora es 450 y solo hay 20-100 conexiones "reales" a la vez.

Mi pregunta:

¿Por qué hay tantas conexiones en el estado de suspensión y cómo puedo evitarlo?

- Actualización:

El número de solicitudes de Apache que se ejecutan a la vez nunca excede las 50 solicitudes simultáneas, por lo que supongo que hay un problema con el cierre de la conexión o que Apache mantiene el puerto abierto sin un phpscript adjunto o algo así (?)

my.cnf en caso de que sea útil:

innodb_buffer_pool_size = 1024M max_allowed_packet = 5M net_buffer_length = 8K read_buffer_size = 2M read_rnd_buffer_size = 8M query_cache_size = 512M myisam_sort_buffer_size = 128M max_connections = 450 thread_cache = 50 key_buffer_size = 1280M join_buffer_size = 16M table_cache = 2048 sort_buffer_size = 64M tmp_table_size = 512M max_heap_table_size = 512M thread_concurrency = 8 log-slow-queries = /daten/mysql-log/slow-log long_query_time = 1 log_queries_not_using_indexes innodb_additional_mem_pool_size = 64M innodb_log_file_size = 64M innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 2 innodb_file_per_table


Básicamente, obtienes conexiones en el estado de Suspensión cuando:

  • un script PHP se conecta a MySQL
  • algunas consultas son ejecutadas
  • Entonces, el script PHP hace algunas cosas que llevan tiempo.
    • sin desconectarse del DB
  • y, finalmente, el script PHP termina.
    • lo que significa que se desconecta del servidor MySQL

Entonces, generalmente terminas con muchos procesos en un estado de Suspensión cuando tienes muchos procesos PHP que permanecen conectados, sin hacer nada en el lado de la base de datos.

Una idea básica, entonces: asegúrate de no tener procesos PHP que se ejecuten durante demasiado tiempo, o obligarlos a desconectarse tan pronto como ya no necesiten acceder a la base de datos.


Otra cosa, que a menudo veo cuando hay alguna carga en el servidor:

  • Hay más y más peticiones que llegan a Apache.
    • lo que significa muchas páginas para generar
  • Cada script PHP, para generar una página, se conecta a la base de datos y realiza algunas consultas.
  • Estas consultas llevan más y más tiempo, a medida que aumenta la carga en el servidor de base de datos.
  • Lo que significa que más procesos se siguen apilando.

Una solución que puede ayudar es reducir el tiempo que tardan sus consultas, optimizando las más largas.


De acuerdo, después de probar todas las soluciones para resolver estos problemas exactos en un blog de wordpress, podría haber hecho algo realmente estúpido o genial ... Sin idea de por qué hay un aumento en las conexiones Mysql, usé el script php a continuación en mi encabezado para matar todos los procesos de sueño ..

Así que cada visitante de mi sitio ayuda a matar los procesos de sueño ...

<?php $result = mysql_query("SHOW processlist"); while ($myrow = mysql_fetch_assoc($result)) { if ($myrow[''Command''] == "Sleep") { mysql_query("KILL {$myrow[''Id'']}");} } ?>


El número creciente de conexiones máximas no resolverá el problema.

Estábamos experimentando la misma situación en nuestros servidores. Esto es lo que pasa

El usuario abre una página / vista, que se conecta a la base de datos, consulta la base de datos, aún así la consulta (consultas) no se completó y el usuario abandona la página o se mueve a otra página. Así que la conexión que estaba abierta permanecerá abierta y seguirá aumentando el número de conexiones, si hay más usuarios que se conectan con la base de datos y hacen algo similar.

Puede configurar la hora de espera de MySQL interactiva, por defecto es 28800 (8 horas) a 1 hora

SET interactive_timeout=3600