Foros del Web » Programando para Internet » PHP »

MySQL server has gone away II

Estas en el tema de MySQL server has gone away II en el foro de PHP en Foros del Web. Bueno "reabro" el post siguiente: http://www.forosdelweb.com/f18/sale-...-away-1029982/ porque no sé la razón por la qué el administrador lo ha cerrado. Espero no violar ninguna política del ...
  #1 (permalink)  
Antiguo 04/01/2013, 10:37
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 18 años, 11 meses
Puntos: 15
MySQL server has gone away II

Bueno "reabro" el post siguiente:

http://www.forosdelweb.com/f18/sale-...-away-1029982/

porque no sé la razón por la qué el administrador lo ha cerrado. Espero no violar ninguna política del foro, si es así, 1000 disculpas.

El caso es que (duelos aparte procedentes del post en cuestión) mi consulta no es sólo a una base de datos sino que empleo el:

http://www.simplepie.org/

que es un script que le mandas un RSS y te devuelve título, descripción, fecha... de cada post de ese RSS.

Yo en el while le mando una serie de RSS (pongamos 25) que tengo almacenados en una base de datos.

Entiendo que debido a que el servidor de alguno de esos RSS tarda más de lo normal -o varios tardan un poco más de lo normal y juntos hacen un mucho- el timeout alcanza su límite.

Pregunta, cómo lo soluciono?

- Se me ocurre que pasando (obviando) de aquél RSS que tarde un poco más de xxx segundos (no es gran problema obviar uno o dos RSS).

- Volviendo a ejecutar toda la consulta desde el principio, ya que, al parecer, los problemas de lentitud de los servidores a los que llamo con el RSS entiendo que son puntuales, ya que no pasa siempre y casi siempre que le doy a actualizar y ejecuto de nuevo la consulta, me la hace correctamente.


Con cualquiera de las soluciones que planteo no sé ni por dónde empezar.

Gracias y haya paz hermanos!!! ;)
  #2 (permalink)  
Antiguo 04/01/2013, 10:44
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: MySQL server has gone away II

El problema como tal es que PHP no tiene (todavía) la forma de ejecutar tareas de forma asíncrona, entonces si uno de tus RSS tarda más de lo debido tu servidor (MySQL) cierra la conexión.

Lo que puedes hacer es incrementar el timeout de tu servidor MySQL para que no cierre la conexión, otra es antes de insertar los resultados (una vez que recibiste la respuesta de tus RSS) verificar que la conexión este abierta (depende del API que estes usando) antes de lanzar de nuevo tu query a la base de datos.

Saludos.
  #3 (permalink)  
Antiguo 04/01/2013, 10:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: MySQL server has gone away II

No tengo idea de por qué cerraron el tema (no soy moderador en este foro), pero posiblemente sea porque el tema se desvió demasiado, y como no llegaste a responder la pregunta puntual de la consulta, quedó medio en la nada.
En cualquier caso, desde el punto de vista del mensaje que recibes, si se origina en un problema de timeout de la consulta, sin saber cómo se hace la consulta no se puede resolver sobre ese aspecto.
Sería interesante ver si es posible reducir la cantidad de servidores que se consulta, como un modo de segmentar las peticiones en grupos y poder determinar cuál de las peticiones trae problemas.
Estoy suponiendo, obviamente, pero de algún modo hay que depurar el origen del timeout vencido.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 04/01/2013, 11:22
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 18 años, 11 meses
Puntos: 15
Respuesta: MySQL server has gone away II

El tema es que no puedo reducir las peticiones.

Lo que hago sobre cada uno de los 25 RSS (por ejemplo) que consulto, es lanzar el script del Simple Pie.

No sé si a nivel individual se podría controlar lo que tarda en hacer la consulta y si es "mucho" pasar al siguiente RSS o bien volver a consultar éste.

GatorV, no hago insert alguno, lo que recojo de cada RSS lo almaceno en una array y luego muestro ésta ordenada por fecha descendente (la más nueva la primera).

De todas formas hablaré con el proveedor de hosting pero si hubiera alguna forma de controlar que si tarda "mucho" pase al siguiente RSS o ejecute de nuevo la consulta sería desde luego mejor solución.

Gracias!

Última edición por humanista; 04/01/2013 a las 11:32
  #5 (permalink)  
Antiguo 04/01/2013, 11:50
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: MySQL server has gone away II

¿Pero entonces en que contexto manejas el SimplePie con MySQL? Porque que yo recuerde SimplePie lo único que hace es parsear el RSS y ya...
  #6 (permalink)  
Antiguo 04/01/2013, 11:59
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 18 años, 11 meses
Puntos: 15
Respuesta: MySQL server has gone away II

Sí, hace el parseo. Yo le paso como parámetro el RSS y me devuelve fecha, título, descripción... igual me he explicado mal.

El SQL sólo para que recorra la base de datos buscando los xx RSS que cumplan una determinada condición, pongamos esos 25 que yo hablaba.
  #7 (permalink)  
Antiguo 04/01/2013, 12:35
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: MySQL server has gone away II

Ah pues entonces, lo que puedes hacer es recorre la consulta primero, guarda las 25 entradas en un array(), y ya luego cicla ese array con el SimplePie.

Es la solución más sencilla.
  #8 (permalink)  
Antiguo 04/01/2013, 12:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: MySQL server has gone away II

Cita:
El SQL sólo para que recorra la base de datos buscando los xx RSS que cumplan una determinada condición, pongamos esos 25 que yo hablaba.
Y cómo es esa consulta, y qué estructura tiene la tabla que lees?

Luego de obtener esos 25 RSS de la tabla, ¿cierras las conexión?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 04/01/2013, 18:56
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 18 años, 11 meses
Puntos: 15
Respuesta: MySQL server has gone away II

El tema es más o menos así:

Select * from tabla where condición (saco los RSS q cumplen una condición)
while
{
Simplepie (hago la consulta de las entradas que tiene el RSS en cuestión)
cargo la array con cada elemento del RSS en cuestión
}

foreach
{
saco la array ordenada por fecha
}
  #10 (permalink)  
Antiguo 04/01/2013, 19:01
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: MySQL server has gone away II

Como te digo, primero haz el select, guarda todos los datos en un array, y después recorre ese array con el simplepie, y luego vas a hacer tu tercer foreach ordenado por fecha.

Saludos.
  #11 (permalink)  
Antiguo 04/01/2013, 19:09
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 18 años, 11 meses
Puntos: 15
Respuesta: MySQL server has gone away II

Ahhh... es decir entiendo que el error sale porque tarda mucho tiempo en terminar la consulta a la tabla (debido al tiempo q está consultando el RSS que bloquea ésta), y NO por el tiempo que tarda en consultar el RSS en cuestión con el Simplepie (independientemente de la consulta a la tabla).

Si la respuesta es SÍ, tu solución valdría entonces.
  #12 (permalink)  
Antiguo 05/01/2013, 16:02
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: MySQL server has gone away II

Así es, el problema como bien dices es lo que se tarda el SimplePie en obtener el RSS y parsearlo, por eso, mejor baja todos los datos que necesitas y luego los ciclas.

Saludos.
  #13 (permalink)  
Antiguo 07/01/2013, 11:45
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 18 años, 11 meses
Puntos: 15
Respuesta: MySQL server has gone away II

Perfecto. Hasta ahora en todas las pruebas que he hecho no se me ha colgado el MySQL. Va igual de lento (pero eso creo que es inevitable porque el Simplepie, o mejor dicho la tecnología RSS, creo yo, es lenta cuando tiene que leer las 10 entradas que hago que lea de cada RSS, es decir digamos 250) pero eso es otra historia.

Gracias Gatorv!
  #14 (permalink)  
Antiguo 07/01/2013, 13:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: MySQL server has gone away II

En un próximo evento te recomiendo uses un Profiler, por ejemplo: http://xdebug.org/docs/profiler este te puede ayudar a detectar donde esta el problema, ya que no siempre el mensaje de error como tal es la causa del problema.

Saludos.
  #15 (permalink)  
Antiguo 16/03/2013, 23:05
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 1 mes
Puntos: 22
Respuesta: MySQL server has gone away II

Cita:
Iniciado por humanista Ver Mensaje
Ahhh... es decir entiendo que el error sale porque...

...debido al tiempo q está consultando el RSS que bloquea ésta...
En mi caso la única solución fué pasarme a MySQLI.

Crear una clase y...
Código PHP:

    
CLASS la_vieja_funcion {
        function 
__construct(){
            
aqui conecto y hago unas config...
            
$this->conex=NEW MYSQLI('localhost',$this->user,$this->clave,$this->basedd);
            .
            .
            .
            
haciendo uso de:
            
$this->conex->QUERY("SHOW VARIABLES LIKE 'connect_timeout';");
            
pude correr:
            if(!
$this->cxonex->ping()){
                ...
                ...
                ...
                
reconectar... 
Espero oriente a otra persona con el "MySQL server has gone away"

Etiquetas: mysql, server
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:51.