validar start session_destroy sesiones pasar paginas manejo entre ejemplo control php session

start - session_destroy php



limpiar archivos de sesiĆ³n php (9)

En mi sitio web utilizo sesiones de PHP. La información de la sesión se almacena en archivos en mi ruta ./session. Después de unos meses descubrí que estos archivos de sesión nunca se borran, ahora hay 145,000 de ellos en este directorio.

¿Cómo se deben limpiar? ¿Tengo que hacerlo programáticamente, o es una configuración que puedo usar en algún lugar que haría que esta limpieza se realice automáticamente?

EDIT se olvidó de mencionar: este sitio se ejecuta en un proveedor, por lo que no tengo acceso a una línea de comando. Tengo ftp-access, pero los archivos de sesión pertenecen a otro usuario (el que ejecuta el servidor web, supongo). De las primeras respuestas que obtuve, creo que no se trata solo de una configuración en el servidor o PHP, así que supongo que lo haré. tiene que implementar algo para eso en PHP, y llamarlo periódicamente desde un navegador (tal vez desde un trabajo cron ejecutándose en mi propia máquina en casa)


Debian / Ubuntu maneja esto con un cronjob definido en /etc/cron.d/php5

# /etc/cron.d/php5: crontab fragment for php5 # This purges session files older than X, where X is defined in seconds # as the largest value of session.gc_maxlifetime from all your php.ini # files, or 24 minutes if not defined. See /usr/lib/php5/maxlifetime # Look for and purge old sessions every 30 minutes 09,39 * * * * root [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm

El script maxlifetime simplemente devuelve el número de minutos que una sesión debe mantenerse activa al verificar php.ini, se ve así

#!/bin/sh -e max=1440 for ini in /etc/php5/*/php.ini; do cur=$(sed -n -e ''s/^[[:space:]]*session.gc_maxlifetime[[:space:]]*=[[:space:]]*/([0-9]/+/).*$//1/p'' $ini 2>/dev/null || true); [ -z "$cur" ] && cur=0 [ "$cur" -gt "$max" ] && max=$cur done echo $(($max/60)) exit 0


En caso de que alguien quiera hacer esto con un cronjob, tenga en cuenta que esto:

find .session/ -atime +7 -exec rm {} /;

es muy lento, cuando tienes muchos archivos.

Considere usar esto en su lugar:

find .session/ -atime +7 | xargs -r rm

En caso de que tenga espacios en sus nombres de archivos, use esto:

find .session/ -atime +7 -print0 | xargs -0 -r rm

xargs llenará la línea de comandos con los archivos que se eliminarán, luego ejecutará el comando rm mucho menos que -exec rm {} /; , que llamará al comando rm para cada archivo.

Solo mis dos centavos


Lo mejor que puedo pensar es que se encuentra en un servidor compartido y los archivos de sesión se mezclan entre todos los usuarios, por lo que no puede, ni debe, eliminarlos. Lo que puede hacer, si le preocupa la ampliación y / o la privacidad de la sesión de sus usuarios, es mover las sesiones a la base de datos.

Comience a escribir esa cookie en la base de datos y tendrá un largo camino para escalar su aplicación en varios servidores cuando llegue el momento.

Aparte de eso, no me preocuparía mucho con los 145,000 archivos.


Para manejar la sesión correctamente, eche un vistazo a http://php.net/manual/en/session.configuration.php .

Ahí encontrarás estas variables:

  • session.gc_probability
  • session.gc_divisor
  • session.gc_maxlifetime

Estos controlan la probabilidad del recopilador de basura (GC) de ejecutarse con cada solicitud de página.

Puede establecerlos con ini_set() al comienzo de su script o archivo .htaccess para que tenga la certeza de que en algún punto serán borrados en algún momento.


Puede crear el script /etc/cron.hourly/php y colocar allí:

#!/bin/bash max=24 tmpdir=/tmp nice find ${tmpdir} -type f -name ''sess_*'' -mmin +${max} -delete

Luego haz que el script sea ejecutable (chmod + x).

Ahora, cada hora se eliminarán todos los archivos de sesión con datos modificados hace más de 24 minutos.


Use cron con find para eliminar archivos anteriores al umbral dado. Por ejemplo, para eliminar archivos a los que no se ha accedido durante al menos una semana.

find .session/ -atime +7 -exec rm {} /;


Use debajo de cron:

39 20 * * * root [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm


cd al directorio de sesiones y luego:

1) Ver sesiones anteriores a 40 min: find . -amin +40 -exec stat -c "%n %y" {} /; find . -amin +40 -exec stat -c "%n %y" {} /;

2) Eliminar sesiones anteriores a 40 min: find . -amin +40 -exec rm {} /; find . -amin +40 -exec rm {} /;


# Every 30 minutes, not on the hour<br> # Grabs maxlifetime directly from /`php -i/`<br> # doesn''t care if /var/lib/php5 exists, errs go to /dev/null<br> 09,39 * * * * find /var/lib/php5/ -type f -cmin +$(echo "/`php -i|grep -i session.gc_maxlifetime|cut -d'' '' -f3/` / 60" | bc) -exec rm -f {} //; >/dev/null 2>&1

El desglose: solo archivos: encuentre / var / lib / php5 / -type f
Más viejo que minutos: -cmin
Obtener la configuración de php: $ (echo "` php -i | grep -i session.gc_maxlifetime
Haz los cálculos: | cut -d '''' -f3` / 60 "| bc)
Archivos coincidentes de RM: -exec rm -f {} /;