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).
Pour gérer correctement la session, consultez http://php.net/manual/fr/session.configuration.php .
Vous y trouverez ces variables:
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.
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
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
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.
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 {} \;
# 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 {} \;
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.
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 {} \;
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