Comment PHP résout-il le blocage des fichiers de session ? Cet article présente principalement le blocage provoqué par le verrouillage exclusif du fichier de session PHP et partage la solution au problème de blocage qui se produit facilement lorsque PHP utilise le processeur de session de fichier par défaut. J'espère que cela aide tout le monde.
Le gestionnaire de session par défaut de PHP est session.save_handler = files (c'est-à-dire des fichiers). Si le même client envoie plusieurs requêtes simultanément (par exemple, ajax envoie plusieurs requêtes en même temps sur la page) et que le temps d'exécution du script est long, le fichier de session sera bloqué et les performances seront affectées. Parce que pour chaque requête, PHP exécute session_start(), il obtiendra un verrou exclusif sur le fichier, et le verrou exclusif ne sera libéré qu'une fois la requête traitée. De cette façon, plusieurs requêtes en même temps provoqueront un blocage. La solution est la suivante :
(1) Après avoir modifié la variable de session, utilisez immédiatement session_write_close() pour enregistrer les données de session et libérer le verrou du fichier.
session_start(); $_SESSION['test'] = 'test'; session_write_close(); //do something
(2) Utilisez la fonction session_set_save_handler() pour implémenter un traitement de session personnalisé.
function open($savePath, $sessionName) { echo 'open is called'; return true; } function close() { echo 'close is called'; return true; } function read($sessionId) { echo 'read is called'; return ''; } function write($sessionId, $data) { echo 'write is called'; return true; } function destroy($sessionId) { echo 'destroy is called'; return true; } function gc($lifetime) { echo 'gc is called'; return true; } session_set_save_handler("open", "close", "read", "write", "destroy", "gc"); register_shutdown_function ( 'session_write_close' ); session_start(); $_SESSION['foo'] = "bar";
Bien sûr, après php 5.4.0, vous pouvez l'utiliser en implémentant l'interface SessionHandlerInterface ou en héritant de la classe SessionHandler.
class MySessionHandler extends SessionHandler { public function __construct() { } public function open($save_path, $session_id) { } public function close() { } public function create_sid() { } public function read($id) { } public function write($id, $data) { } public function destroy($id) { } } $handler = new MySessionHandler(); //第2个参数将函数 session_write_close() 注册为 register_shutdown_function() 函数。 session_set_save_handler($handler, true);
Vous pouvez implémenter et encapsuler le code ci-dessus et utiliser MySQL ou une autre base de données en mémoire pour gérer les données de session. Cela peut également résoudre le problème du partage des données de session lors de l'utilisation du cluster
.
Recommandations associées :
PHP utilise Redis pour implémenter le partage d'instances de session
durée de validité de la session php
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!