Archivo de Junio 2008

h1

¡Solucioné el problema con MySQL!

16.Junio.2008

Oh wait! En realidad el problema no era con MySQL sino con… exacto! con Internet Explorer!!!

Un usuario (Atolon), en un comentario del blog me dio una pista. Me comentó que con IE7 las imágenes se le cargaban dos veces. Pensé que sería algo puntual pero investigué…

HispaShare carga muchísimas imágenes, tanto en la portada como en las fichas de las películas. Si tuviera que pagar todo ese ancho de banda de mi bolsillo estaría apañado. Por lo tanto la web va subiendo las imágenes a distintos servidores gratuitos (actualmente utilizo alrededor de una docena).

Pues bien, ocurre que, a veces, los servidores gratuitos borran las imágenes, cortan el servicio, están saturados, etc. Con un simple javascript, el navegador de cada usuario detecta si hay un error cargando la imagen y si lo hay, solicita mediante AJAX la copia local almacenada en la web, así siempre se mostrará una imagen. A través de este AJAX también se marca la entrada de la base de datos referente a esa imagen para que la web más tarde pueda comprobar si realmente está borrada y si lo está, volver a subirla. ¿Lioso? Aún queda mas…

Por otro lado, ciertos servidores gratuitos, limitan en ancho de banda diario para una imagen concreta, en ese caso te reemplazan la imagen por otra en la que aparece el aviso de “Bandwidth Exceeded”. De nuevo, el navegador de cada usuario detecta esto. Otro javascript se dedica a comprobar que las dimensiones y formato de las imágenes cargadas se corresponde con la original y en caso de que no, solicita la copia alojada en mi servidor (todas estas comprobaciones no suponen una carga para la web ya que las hace el navegador de cada usuario).

¿Y que tiene que ver Internet Explorer en todo esto? Pues que se hace la picha un lío cuando tiene que comprobar los tamaños de muchas imágenes a la vez y las da todas como erróneas aunque hayan cargado correctamente. Es decir, simplemente en la portada, implica 30 peticiones AJAX, con sus 30 conexiones a MySQL y unas 4 operaciones en la base de datos por conexión. Si multiplicamos eso por 500 ó 1000 usuarios casi simultáneos que utilicen Internet Explorer… pues eso, se me satura el servidor de bases de datos, me utiliza un montón de ancho de banda (porque carga todas las imágenes de mi servidor) y me marca todas las imágenes como erróneas lo cual le da mucho trabajo a la web para ir comprobándolas posteriormente.

Lo que he hecho es que todo aquel que no utilice Firefox no podrá ejecutar la comprobación de las dimensiones y el formato, por lo tanto, de vez en cuando puede aparecer una imagen de esas de “Bandwidth Exceeded”, pero será por poco tiempo porque los usuarios que usen Firefox detectarán los errores y su navegador avisará a mi servidor de que hay que volver a subir las imágenes.

Aún así estoy contento de lo bien que ha respondido el servidor trabajando en unas condiciones tan penosas y aguantando como un campeón.

h1

Apaño para MySQL

03.Junio.2008

Como de vez en cuando sigue saliendo el error de MySQL (sobre todo cuando más tráfico hay) y no consigo averiguar la causa, he hecho una chapucilla, a ver que pasa ahora…
function mysql_connect_db() {
  global $mysql_user, $mysql_pass, $mysql_host, $mysql_data;
  $link = false;
  $i = 0;
  while (($i<3) and ($link===false)) {
    if ($i>0) sleep(2);
    $link = @mysql_connect($mysql_host, $mysql_user, $mysql_pass);
    $i++;
  }
  if ($link===false) die("MySQL connect: ".mysql_error());
  mysql_select_db($mysql_data, $link) or die("MySQL select: ".mysql_error());
  return $link;
}

Básicamente lo que dice el código es: “si no puedes conectar, espérate un rato y vuelve a intentarlo”.
Si a alguien se le ocurre algo mejor, que me lo diga.