web-dev-qa-db-fra.com

nettoyage des fichiers de session php

Sur mon site Web, j'utilise des sessions PHP. Les informations de session sont stockées dans des fichiers de mon chemin ./session. Après quelques mois, j'ai découvert que ces fichiers de session ne sont jamais supprimés. Il en existe maintenant 145 000 dans ce répertoire. 

Comment doivent-ils être nettoyés? Dois-je le faire par programme ou existe-t-il un paramètre que je peux utiliser quelque part pour que ce nettoyage se fasse automatiquement?

EDITa oublié de mentionner: Ce site est géré par un fournisseur, je n'ai donc pas accès à une ligne de commande. J'ai un accès ftp, mais les fichiers de session appartiennent à un autre utilisateur (celui que le serveur Web fonctionne normalement, je suppose). Il faut implémenter quelque chose pour cela en PHP et l'appeler périodiquement depuis un navigateur (peut-être depuis un travail cron exécuté sur ma propre machine à la maison).

54
Jack

Pour gérer correctement la session, consultez http://php.net/manual/fr/session.configuration.php .

Vous y trouverez ces variables:

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

Ceux-ci contrôlent la probabilité d'exécution d'un récupérateur de mémoire (GC) avec chaque demande de page.

Vous pouvez les définir avec ini_set () au début de votre script ou de votre fichier .htaccess afin de vous assurer que, dans une certaine mesure, ils seront supprimés de temps en temps.

53
Seb

Debian/Ubuntu s’occupe de cela avec un cronjob défini dans /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

Le script maxlifetime renvoie simplement le nombre de minutes pendant lesquelles une session doit être maintenue en vérifiant le fichier php.ini.

#!/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
33
Paul Dixon

Dans le cas où quelqu'un voudrait le faire avec un travail cronjob, veuillez garder ceci à l'esprit:

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

c'est vraiment lent quand on a beaucoup de fichiers.

Pensez à utiliser ceci à la place:

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

Dans le cas où vous avez des espaces dans vos noms de fichiers, utilisez ceci:

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

xargs remplira la ligne de commande avec les fichiers à supprimer, puis exécutera la commande rm beaucoup moins que -exec rm {} \;, qui appellera la commande rm pour chaque fichier.

Juste mes deux cents

21
Andi

Vous pouvez créer le script /etc/cron.hourly/php et y mettre:

#!/bin/bash

max=24
tmpdir=/tmp

Nice find ${tmpdir} -type f -name 'sess_*' -mmin +${max} -delete

Ensuite, rendez le script exécutable (chmod + x). 

Désormais, toutes les heures seront supprimés de tous les fichiers de session contenant des données modifiées il y a plus de 24 minutes.

5
Daniel Milde

Utilisez cron avec find pour supprimer les fichiers plus anciens que le seuil spécifié. Par exemple, supprimer des fichiers auxquels on n'a pas accédé depuis au moins une semaine.

find .session/ -atime +7  -exec rm {} \;
5
vartec
# 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

La ventilation: Seuls les fichiers: find/var/lib/php5/-type f
Plus vieux que minutes: -cmin 
Obtenir les paramètres php: $ (echo "` php -i | grep -i session.gc_maxlifetime 
Faites le calcul: | cut -d '' -f3`/60 "| bc) 
RM correspondant aux fichiers: -exec rm -f {} \; 

3
Dr. Tyrell

Ma meilleure hypothèse serait que vous êtes sur un serveur partagé et que les fichiers de session sont mélangés avec tous les utilisateurs, vous ne pouvez donc ni ne devriez les supprimer. Si vous vous inquiétez de la mise à l'échelle et/ou de la confidentialité de la session de vos utilisateurs, vous pouvez déplacer les sessions vers la base de données.

Commencez à écrire ce cookie dans la base de données et vous aurez beaucoup de chemin à faire pour adapter votre application à plusieurs serveurs lorsque le moment sera venu.

En dehors de cela, je ne m'inquiéterais pas beaucoup avec les 145 000 fichiers.

2
Frankie

allez dans le répertoire des sessions puis:

1) Voir les sessions de plus de 40 minutes: find . -amin +40 -exec stat -c "%n %y" {} \;

2) Supprimer les sessions de plus de 40 minutes: find . -amin +40 -exec rm {} \;

1
David Lefkon

Utilisez ci-dessous 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
0
MaheshPatade