Position actuelle: Accueil> Derniers articles> Utilisation de php native session_register_shutdown () dans Laravel

Utilisation de php native session_register_shutdown () dans Laravel

M66 2025-05-25

Dans le développement de PHP moderne, Laravel fournit un puissant mécanisme de gestion de session et utilise par défaut les moteurs de middleware et de configuration pour encapsuler le comportement de session de PHP natif. Cependant, dans certains scénarios avancés, les développeurs peuvent avoir besoin d'appeler directement les fonctions natives de PHP, telles que session_register_shutdown () , pour contrôler le cycle de vie de la session plus granulaire. Cet article expliquera comment intégrer cette fonction dans Laravel et explorer ses scénarios et considérations d'utilisation.

1. Comprendre session_register_shutdown ()

Session_register_shutdown () est une fonction en PHP qui enregistre une fonction qui est automatiquement appelée à la fin de l'exécution du script. Il est généralement utilisé pour garantir que les données de session sont correctement enregistrées lorsque le script est fermé. Cette fonction convient particulièrement au nettoyage ou aux opérations de persistance de données dans un processeur de session personnalisé.

2. Introduction au mécanisme de conversation Laravel

Laravel utilise la classe SessionManager pour gérer uniformément toute logique de session. La couche sous-jacente sélectionne le pilote de session via le fichier de configuration config / session.php , tel que le fichier, la base de données, le redis, etc. Laravel n'expose pas directement la méthode du cycle de vie de session natif par défaut, mais nous permet d'accéder à la logique sous-jacente via une implémentation personnalisée de sessionhandlerterface.

3. Session intégrée_register_shutdown ()

Étape 1: Créez un processeur de session personnalisé

Créez une nouvelle classe de processeur et héritez de l'interface SessionHandlerInterface :

 namespace App\Extensions;

use SessionHandlerInterface;

class NativeSessionHandler implements SessionHandlerInterface
{
    public function open($savePath, $sessionName)
    {
        return true;
    }

    public function close()
    {
        return true;
    }

    public function read($id)
    {
        // Lire session données
        return '';
    }

    public function write($id, $data)
    {
        // Écrire session données
        file_put_contents('/tmp/sessions/' . $id, $data);
        return true;
    }

    public function destroy($id)
    {
        @unlink('/tmp/sessions/' . $id);
        return true;
    }

    public function gc($maxLifetime)
    {
        // Effectuer la collection des ordures
        return true;
    }
}

Étape 2: Enregistrez le processeur et appelez session_register_shutdown ()

Vous pouvez enregistrer un processeur et utiliser des fonctions natives dans le fournisseur de services de Laravel:

 // App\Providers\AppServiceProvider.php

use App\Extensions\NativeSessionHandler;

public function boot()
{
    $handler = new NativeSessionHandler();
    session_set_save_handler($handler, true);

    // Traitement de session lorsque l'inscription est fermée
    session_register_shutdown();

    // Démarrage manuel session(Si ce n'est pas utilisé Laravel middleware)
    if (session_status() === PHP_SESSION_NONE) {
        session_start();
    }
}

Étape 3: Modifiez la configuration et utilisez une logique personnalisée (facultative)

Si vous souhaitez que toutes les demandes de Laravel passent par ce processeur de session personnalisé, vous pouvez désactiver le middleware par défaut et remplacer la configuration. Sinon, seules les demandes spécifiques peuvent utiliser cette logique.

4. Utilisez des scénarios

  • Contrôler le comportement dans un environnement CLI ou un script asynchrone

  • Évitez la perte de données de session causée par la sortie tamponnée et d'autres problèmes lors de l'arrêt Laravel

  • Enregistrer les données de session dans un emplacement personnalisé ou un service externe du système, comme l'interface http://m66.net/session-api

 public function write($id, $data)
{
    $url = 'http://m66.net/session-api/store';
    file_get_contents($url . '?id=' . urlencode($id) . '&data=' . urlencode($data));
    return true;
}

5. Choses à noter

  • Le code utilisant session_register_shutdown () doit être exécuté plus tôt dans le cycle de vie de la demande pour éviter d'être interféré par le midleware de Laravel ou le mécanisme de mise en cache de réponse.

  • Si vous utilisez le middleware de session de Laravel (comme les groupes de middleware Web ), vous devez éviter les conflits avec la logique de contrôle de session native.

  • Il est recommandé d'inclure des journaux et une gestion des exceptions de tous les processeurs personnalisés dans le système de journalisation de Laravel pour faciliter le suivi des problèmes.

6. Conclusion

Bien que Laravel fournit un mécanisme d'encapsulation de session avancé, selon des exigences spécifiques, la combinaison de Session natifs PHP_register_shutdown () peut apporter plus de capacités de contrôle granulaires. Avec un SessionHandler personnalisé, vous pouvez combiner la flexibilité de Laravel avec les exigences de réglage des performances sous-jacentes pour fournir un support de gestion de session plus stable pour les systèmes complexes.