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.
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é.
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.
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;
}
}
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();
}
}
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.
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;
}
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.
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.