38 votes

Clarification de la collecte d'ordures en PHP

D'après le manuel de PHP, session.gc_probability et session.gc_divisor indiquent que le gc se produira en fonction de cette probabilité. Je comprends.

Ce qui n'est pas clair, c'est si cette probabilité est sur une base de session par session ou globale.

Donc, si ma probabilité est de 1 % (1/100) que le GC se produise, cela signifie-t-il que si une session continue à être étendue, chaque fois qu'il y a un changement de 1 %, cette session spécifique sera nettoyée ? Ou cela signifie-t-il que 1 % de toutes les sessions existantes (ainsi que les nouvelles sessions) déclencheront le GC pour toutes les autres sessions existantes ?

Je suis presque sûr que c'est le dernier, je veux juste m'en assurer.

L'objet de cette question est que sur notre site, je veux que les utilisateurs aient des sessions à long terme (6 mois). Si 1 % de toutes les sessions déclenchent le GC, cela supprime effectivement l'objectif de cette session à long terme, car le GC se produira toutes les heures ou toutes les deux heures.

11voto

romaninsh Points 6048

Chaque fois qu'un script PHP est exécuté et démarre une session, il y a une probabilité qu'il balaye le dossier de la session en tuant l'ancienne session.

Le nettoyage effacera seulement les sessions qui n'ont pas été accédées pendant un certain temps. Cependant, PHP ne garantit pas que la session sera détruite dans ce délai.

Votre stratégie de session à long terme devrait fonctionner parfaitement, mais vous pourriez vouloir réduire le pourcentage de 1 % à 0,1 %, par exemple.

Une autre chose à laquelle il faut faire attention est que le système d'exploitation peut nettoyer votre dossier /tmp lors du redémarrage, même si PHP ne le fait pas.

7voto

goat Points 17643

La dernière fois que j'ai regardé la source, chaque appel à session_start() "jetait les dés" pour ainsi dire, en utilisant le diviseur et la probabilité. Si le résultat est positif, alors il supprime tous les fichiers de la section session.save_path qui étaient plus anciens que session.gc_maxlifetime . J'ai oublié s'il utilisait l'heure de modification ou d'accès du fichier, bien que cela ne devrait pas avoir d'importance dans des curcumstances normales parce que php écrase le fichier de session par défaut à la fin de l'exécution du script, donc les heures de mod et d'accès devraient presque toujours correspondre très étroitement.

// Rough psuedo code of how php's session_start() function works regarding garbage collection.
function session_start() {
    $percentChanceToGC = 100 * ini_get('session.gc_probability') / ini_get('session.session.gc_divisor');
    $shouldDoGarbageCollection = rand(1, 100) < $percentChanceToGC;
    if ($shouldDoGarbageCollection) {
        $expiredCutoffTime = time() - ini_get('session.gc_maxlifetime');
        foreach (scandir(ini_get('session.save_path')) as $sessionFile) {
            if (filemtime($sessionFile) < $expiredCutoffTime) {
                unlink($sessionFile);
            }
        }
    }

    // ... rest of code ....
}

Je ne sais pas combien de fichiers de session vous allez devoir faire traîner si vous voulez qu'ils vivent pendant au moins 6 mois. Considérez que cela peut prendre un peu de temps à php pour statuer sur plusieurs milliers de fichiers afin de déterminer leur âge. Vous devriez peut-être envisager d'autres options pour le stockage durable de ces données. Ou vous pourriez désactiver php gc et simplement exécuter une tâche cron pour supprimer les fichiers de session périmés. Sinon, ces 1% de requêtes vont déclencher le gc et devront attendre php ; en d'autres termes, il pourrait y avoir un décalage.

2voto

lonesomeday Points 95456

Je ne suis pas un expert en la matière, mais à la lecture du manuel, j'attire votre attention sur un autre paramètre, session.gc_maxlifetime . Dans la documentation :

_session.gc_maxlifetime_ spécifie le nombre de secondes après lequel les données seront considérées comme des "déchets" et potentiellement nettoyées. Le ramassage des déchets peut avoir lieu au début de la session (en fonction des paramètres suivants session.gc_probability y session.gc_divisor ).

Ainsi, si vous définissez ce paramètre à une valeur appropriée ( 60 * 60 * 24 * 365 / 2 pendant une demi-année, donc 15768000 ), alors les données appropriées ne seront pas éligibles pour la collecte des déchets, peu importe les autres paramètres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X