Je vous ai déjà parlé du problème des fichiers de session PHP.
Or, je me suis aperçu que le problème n’est toujours pas réglé sous Debian : les fichiers de session de PHP ne sont jamais effacés et cela finit par saturer la partition /root
.
Sur le serveur, ces fichiers prenaient 590 Mo, ce qui est énorme vu que ces fichiers ont la taille d’un fichier de cookies. Il y en a donc des milliers, dans un seul répertoire, ce qui consomme un maximum d’inodes.
A oneliner to rule ’em all
Voici le nombre d’inodes avant de lancer la commande de nettoyage :
df -i
Résultat:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/root 640K 212K 429K 34% /
devtmpfs 487K 1.5K 486K 1% /dev
tmpfs 487K 864 487K 1% /run
tmpfs 487K 4 487K 1% /run/lock
tmpfs 487K 2 487K 1% /run/shm
/dev/sda2 44M 75K 43M 1% /home
Voici donc comment régler le problème en une seule ligne, dans le terminal. On supprime tous les fichiers de sessions qui existent depuis plus de 24 minutes (TTL par défaut de PHP) :
find /var/lib/php/sessions -type f -cmin +24 -name 'sess_*' | xargs rm
Code language: JavaScript (javascript)
Notez la rapidité d’exécution de la commande, grâce à xargs
.
On relance le calcul d’inodes:
df -i
Résultat:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/root 640K 88K 553K 14% /
devtmpfs 487K 1.5K 486K 1% /dev
tmpfs 487K 864 487K 1% /run
tmpfs 487K 4 487K 1% /run/lock
tmpfs 487K 2 487K 1% /run/shm
/dev/sda2 44M 75K 43M 1% /home
Boom : 20% d’inodes en plus. Pas mal, surtout que ces sessions sont expirées depuis belle lurette et auraient dues être supprimées depuis bien longtemps.
Crontab pour supprimer les fichiers de session PHP
Le mieux reste encore de créer une tâche cron qui va vérifier chaque jour que le répertoire de sessions ne se remplit pas inutilement.
Nous allons toutefois faire les choses avec un peu plus de finesse : chercher le chemin de stockage des sessions ainsi que la durée de vie des sessions et supprimer chaque jour les fichiers expirés.
On crée notre script bash:
nano /etc/scripts/cleanup-php-sessions.sh
#!/bin/bash
# Script Name : cleanup-php-sessions.sh
# Author : Matt Biscay
# Author URL : https://www.skyminds.net/?p=28992
# Hire me : https://www.skyminds.net/hire-me/
# Export bin paths
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Get PHP Session Details
PHPSESSIONPATH=$(php -i 2>/dev/null | grep -w session.save_path | awk '{print $3}' | head -1);
PHPSESSIONLIFETIME=$(php -i 2>/dev/null | grep -w session.gc_maxlifetime | awk '{print $3}' | head -1);
PHPSESSIONLIFETIMEMINUTE=$( expr $PHPSESSIONLIFETIME / 60 );
# If PHPSESSIONPATH exists
if [ -d $PHPSESSIONPATH ];
then
# Find and delete expired sessions files :
# Sluggish way
#find $PHPSESSIONPATH -type f -cmin +$PHPSESSIONLIFETIMEMINUTE -name "sess_*" -exec rm -f {} \;
# Quick way
find $PHPSESSIONPATH -type f -cmin +$PHPSESSIONLIFETIMEMINUTE -name 'sess_*' | xargs rm
fi
Code language: PHP (php)
Il ne reste plus qu’à l’activer:
crontab -e
et on lance le script tous les jours à minuit :
@daily sh /etc/scripts/cleanup-php_sessions.sh #Cleanup PHP sessions daily
Code language: CSS (css)
Et voilà, mine de rien, vous venez de vous enlever une future épine du pied.
C’est typiquement le genre de fichiers que l’on ne surveille pas et qui peuvent un jour poser problème, notamment au niveau des inodes.
Recherchez-vous un expert WordPress ou WooCommerce sur qui vous pouvez compter? Ne cherchez plus.