web-dev-qa-db-fra.com

Comment le noyau déclenche le nettoyage des sessions expirées dans la base de données?

core/lib/Drupal/Core/Session/SessionHandler.php définit une méthode (gc ()) pour effacer les sessions expirées de la base de données (table des sessions)

quand est-ce déclenché? existe-t-il un moyen de le déclencher à partir de l'interface?

je sais que je peux simplement tronquer les sessions manuellement ou avec un cron ou une commande drush personnalisée ..., mais je me demande comment le core l'utilise et ce qui le déclenche par défaut

Merci

5
izus

Configuration de la récupération de place

Lorsqu'une session s'ouvre, PHP appellera le gestionnaire gc de manière aléatoire selon la probabilité définie par session.gc_probability/session.gc_divisor. Par exemple, si ces étaient fixés à 5/100 respectivement, cela signifierait une probabilité de 5% De même, 3/4 signifierait une chance d'être appelé sur 3, soit 75%.

Si le gestionnaire de récupération de place est invoqué, PHP transmettra la valeur stockée dans la directive php.ini session.gc_maxlifetime. Dans ce contexte, cela signifie que toute session stockée qui a été enregistrée il y a plus de gc_maxlifetime Doit être supprimée. Cela permet d'exécuter les enregistrements en fonction du temps d'inactivité.

Cependant, certains systèmes d'exploitation (par exemple Debian) font leur propre gestion de session et définissent la variable session.gc_probability À 0 pour arrêter PHP faisant le ramasse-miettes. C'est pourquoi Symfony écrase maintenant cette valeur à 1.

Si vous souhaitez utiliser la valeur d'origine définie dans votre php.ini , ajoutez la configuration suivante:

# config/packages/framework.yaml
framework:
    session:
        gc_probability: null

Source: documents officiels de Symphony sur la configuration des sessions et les gestionnaires de sauvegarde

Dans Drupal cela se voit dans /sites/default/default.settings.php

/**
 * Some distributions of Linux (most notably Debian) ship their PHP
 * installations with garbage collection (gc) disabled. Since Drupal depends on
 * PHP's garbage collection for clearing sessions, ensure that garbage
 * collection occurs by using the most common settings.
 */
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);

Étant donné que les "paramètres les plus courants" ci-dessus sont définis sur 1/100, le nettoyage de la mémoire s'exécute 1% du temps.

Maintenant, selon le commentaire du code, je suppose que cela ne se met pas dans settings.php quand il est généré automatiquement si votre distribution en a déjà défini un dans l'un de ses fichiers car je ne vois pas cela dans mon settings.php

Vous pouvez également définir cela dans services.yml comme vu dans cette réponse .


En conclusion

Notez que bien que Drupal soit construit au-dessus de Symphony, il ne s'appuie pas sur Symphony pour cela. Je viens de citer leur belle explication dans leur documentation.

Nous avons appris que PHP appelle automatiquement cette méthode gc() tous les session.gc_probability/session.gc_divisor% Du temps et si vous regardez PHP docs sur SessionHandler.

SessionHandler est une classe spéciale qui peut être utilisée pour exposer le gestionnaire interne de sauvegarde de session PHP session par héritage. Il existe sept méthodes qui encapsulent les sept rappels de gestionnaire de sauvegarde de session interne (ouvrir, fermer, lire, écrire, détruire, gc et create_sid).

Source: http://php.net/manual/en/class.sessionhandler.php

core/lib/Drupal/Core/Session/ SessionHandler.php

/**
 * Default session handler.
 */

class SessionHandler extends AbstractProxy implements \SessionHandlerInterface { ...

 /**
   * {@inheritdoc}
   */
  public function gc($lifetime) {
    // Be sure to adjust 'php_value session.gc_maxlifetime' to a large enough
    // value. For example, if you want user sessions to stay in your database
    // for three weeks before deleting them, you need to set gc_maxlifetime
    // to '1814400'. At that value, only after a user doesn't log in after
    // three weeks (1814400 seconds) will his/her session be removed.
    $this->connection->delete('sessions')
      ->condition('timestamp', REQUEST_TIME - $lifetime, '<')
      ->execute();
    return TRUE;
  }
5
No Sssweat