Error del garbage collector en distribuciones Linux que tienen a Debian como base

Hay un bug inquietante en la instalación por defecto de PHP sobre servidores Debian y distribuciones que parten de él (como Ubuntu). Aparentemente el error aparece de forma aleatoria y con el siguiente mensaje:

Si vuelves a ejecutar refrescar la página el error ya no aparece. Con el tiempo llega a ser desesperante 😛
Bueno, si tu te has encontrado mas de una vez con este insecto te explico porque este error se dispara y como solucionarlo.

Las sesiones de php son datos asociados a un cliente que visita el servidor. Cuando un visitante se conecta por primera vez al servidor este le asigna un codigo para identificar al mismo cliente durante su visita. El cliente entrega este codigo en cada comunicacion de tal forma que el servidor pueda reconocer al visitante y a su vez asociar informacion adicional a este codigo sin que el cliente lo sepa. Para entenderlo mas facilmente, el servidor le asigna al visitante un casillero numerado y le entrega el numero de la llave para reconocerlo mas tarde.
En servidores web de produccion, que pueden tener miles de visitantes en tan solo unos minutos, almacenar los codigos de sesion en memoria resulta una mala idea, por lo que almacena todos estos codigos en el disco duro (quedando los mas nuevos o mas utilizados en la RAM del servidor).
Cuando un visitante deja de comunicarse con el servidor por un largo tiempo, el servidor entiende que ese visitante ya se ha retirado y procede a anular su sesion, pero la informacion asociada a esta aun queda en el disco duro. PHP esta configurado para depurar regularmente las sesiones inactivas y asi no llenar el disco duro de basura.
El problema aparece aqui. En los servidores Debian las sesiones son almacenadas en un directorio con permisos restringidos y estas son depuradas por el cron del sistema. Entonces, cuando PHP intenta realizar la depuracion se produce un error debido a que PHP no tiene los permisos suficientes sobre el directorio de sesiones.

La solucion es muy simple: Decirle a PHP que no depure las sesiones. Dejar que cron lo haga.
Para esto abre y modifica la siguiente linea en el archivo de configuracion de PHP (php.ini). En Ubuntu lo puedes encontrar usualmente en /etc/php5/apache2/php.ini. (no olvides abrirlo con permiso de escritura).

No recuerdo el numero de linea ahora. Debe estar ubicado en la seccion de parametros de configuracion de sesiones.
Cambia el valor de gc_probability a 0 para que PHP nunca depure las sesiones olvidadas.

Guardar los cambios, reinicias apache y listo.

La solucion fue hallada gracias a este hilo de discusión:
http://forum.kohanaframework.org/discussion/565/garbage-collector-error-with-sessions-on-debian/p1

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.