Hoy me han enviado un correo electrónico del proveedor de hosting de una web de un cliente importante de mi empresa avisándome que por segunda vez en menos de un mes, volvíamos a tener un problema con un bucle infinito.
Si esto sigue así, tendremos que recortar los privilegios de los que estáis disfrutando, blablablabla…
El tira y afloja típico, vamos. Nos pusimos aquí manos a la obra para solucionarlo de nuevo y descubrimos lo siguiente.
El objetivo del script es recorrer los días del año buscando que se cumpla una condición para terminar. Si no se cumple esa condición, el script seguirá hasta la fecha final definida por el cliente desde el apartado de gestión. Este es el código que yo utilizaba para recorrer los días dentro del bucle while:
$aux = mktime(0,0,0,$mes,$dia,$ano) + 24*60*60;
$fecha_actual = date(“Y-m-d”, $aux);
Todo funciona sin problemas hasta el 25/10/2009. A partir de ese día, la fecha no se incrementaba y quedaba para siempre bloqueada en ese fatídico día 25/10/2009. Curioso era que si cambiaba el código y pasaba a sumar el día de otra manera, el código empezaba a funcionar misteriosamente.
$fecha_actual = date(“Y-m-d”, mktime(0,0,0,$mes,($dia+1),$ano);
Gracias a mi compañero de trabajo, hemos descubierto cual era el motivo. Probamos a sumar horas en vez de sumar días y hemos descubierto que el 25/10/2009 las 2 de la madrugada se repetía una vez. Comprobando el calendario, vimos que era la madrugada del domingo y mi compañero se dió cuenta de que era el cambio de hora!!
Efectivamente, el 25/10/2009 cambia la hora. Cuando den las 3 de la madrugada volverán a ser las 2. Esto que puede parecer algo inocente era lo que hacía entrar en un bucle infinito mi código. Si lo pensamos, en mi primer código lo que hago es sumar 24 horas al 25/10/2009 desde las 12 de la noche. Ese día se produce el cambio de hora, o sea que en realidad en vez de tener 24 horas, tiene 25. Después de realizar la suma y al volver a convertir los segundas en fecha normal, me encuentro con que estoy en el mismo día, efectivamente.
Os propongo dos soluciones. La primera sumar dentro de la propia función mktime como hice en el segundo cacho de código que os pegué. La segunda sería sumar en vez de las 12 de la noche, las 12 del mediodía con lo cual dejaría de afectarnos el cambio de hora. Quedaría algo así:
$aux = mktime(12,0,0,$mes,$dia,$ano) + 24*60*60;
$fecha_actual = date(“Y-m-d”, $aux);
Cuando piensas que ya lo sabes todo de PHP, siempre te acaban sorprendiendo…