PHP & amp; Sessions: Y at-il un moyen de désactiver le verrouillage de session PHP?
Est-il un moyen pour désactiver le verrouillage de session en PHP en utilisant le gestionnaire de session par défaut?
[EDIT:] Ou est-il au moins un moyen de relancer une session après l'appel de session_write_close()
? session_start()
ne fonctionne pas si une sortie est déjà envoyé au navigateur.
source d'informationauteur Taloncor
Vous devez vous connecter pour publier un commentaire.
Vous ne voulez pas désactiver... Si vous le faites, vous allez exécuter potentiellement dans toutes sortes de problèmes bizarres où vous vous connectez sur une fenêtre, avoir ouvert une session sur l'autre et puis le vent dans un état incohérent... Le verrouillage est là pour une raison...
Au lieu de cela, fermer la session, très tôt, si vous savez que vous n'allez pas écrire dans cette demande. Une fois que vous commencez, vous serez en mesure de lire pour l'ensemble de la demande (à moins que vous re-démarrer, ou faire d'autres choses en particulier), même après que vous appelez
session_write_close
. Donc ce que vous devriez faire, c'est vérifier la demande pour voir si c'est une demande d'écriture, et si elle ne l'est pas, il suffit de fermer tout de suite après l'ouverture. Notez que cela peut avoir certains effets négatifs, si vous essayez d'écrire sur la session (Pour Captcha ou la protection CSRF ou autre chose), donc à utiliser avec précaution...Mais au lieu d'essayer de la contourner, je voudrais mettre mon effort dans le raccourcissement de la demande de longueurs (pour réduire le conflit de verrouillage), ou de faire cookieless demandes pour ces demandes qui n'ont pas besoin de la session à tous les...
J'ai eu une page de rapport a fallu plus de 2 minutes (plus de 80 demandes d'AJAX). Je l'ai eu à moins de 30 secondes, par la suppression de la session de verrouillage. Oui, à dieu ne plaise, vous supprimer le verrouillage de fichier, parce que vous avez des conditions de course. Et si vous ne comprenez pas la race conditions et vous ne savez pas quel serait l'effet sur vos séances...alors il ne faut PAS supprimer le fichier de verrouillage. Toutefois, si vous, en sachant que les données de vos séances, et de savoir ce que la race conditions ne, de sentir qu'il n'existe pas de données qui pourrait être affectée par des conditions de course qui permettrait de créer un bug...vous connaissez votre environnement mieux que quiconque, alors allez-y.
MySQL, REDIS, et Memcache
Notez également que si vous passez à MySQL pour la gestion de session, il y a 99% de chance, à mon humble avis, que vous n'avez PAS de blocage de la ligne à partir de l'instant où vous lisez pour le temps de vous écrire. Ainsi, l'utilisation de MySQL, vous avez encore les mêmes conditions de course (ou de blocage des problèmes si vous décidez de verrouiller la ligne).
Sur la base des informations que j'ai pu trouver, les gens qui utilisent PHP Redis utilisez un non-verrouillage de l'application qui est sujette à des conditions de course...que par le fil de discussion suivant...et ils citent la vitesse est l'une des raisons qu'ils aiment cette "fonctionnalité":
https://github.com/phpredis/phpredis/issues/37
Memcached ne prend pas en charge le verrouillage de session jusqu'à la version 3.0.4...donc, c'était aussi--d'abord--sujettes à des conditions de course.
Clairement, avec le succès de ces options, les conditions de course ne sont pas le plus gros problème que les programmeurs visage.
En fin de compte, la Question Est de
La chose importante à propos des Sessions et de Verrouillage contre la Simultanéité et des conditions de course est de connaître votre application, de savoir si une condition de concurrence peut casser votre application...et de trouver une solution qui convient à VOTRE application. Si tout ce que vous faire est de stocker le nom d'utilisateur dans la session et de le lire sur toutes les demandes ultérieures, vous n'avez probablement pas besoin de s'inquiéter à propos des conditions de course. Si vous stockez un complexe historique de données qui va briser si les choses se passent hors de l'ordre ou les données peuvent être perdues, puis verrouiller le fichier entre la lecture et l'écriture et essayez de faire de votre écriture aussi rapidement après la lecture que possible pour limiter la quantité de fois que le fichier est verrouillé.
La Meilleure Option
Une session API, cependant, être beaucoup mieux pour les demandes simultanées. Toutefois, si vous n'avez pas le temps de refactoriser à une telle API...la lecture sur.
Une Solution bancale de garder à l'aide de PHP les fichiers de session et arrêter de verrouillage
De continuer à utiliser sessions PHP par défaut, à cesser de verrouillage, et ont essentiellement une solution très rapide à un problème complexe, vous pouvez mettre en œuvre le site web PHP exemple de la mise en œuvre d'un SessionHandler.
J'ai le code ci-dessous exécute dans un environnement de production pour un site avec des dizaines de milliers de connexions par minute, et je n'ai pas eu de problèmes avec des conditions de course, mais je n'ai pas de stocker des données que d'une course-condition pourrait se casser. Ce code, comme je l'ai dit, a obtenu un rapport de plus de 2 minutes à moins de 30 secondes...et il a fallu que quelques minutes à mettre en œuvre. Pas de MySQL schéma de créer, pas de Memcache ou Redis à installer.
C'est, dans une lettre, l'exemple de la mise en œuvre fournis sur PHP documentation (http://php.net/manual/en/class.sessionhandlerinterface.php), et il n'est pas verrouiller le fichier de session lors de la lecture.
En PHP 5.4+, son utilisation est aussi simple que de créer le gestionnaire avant de commencer votre séance:
Pour les versions antérieures de PHP, vous pouvez toujours le faire via des appels de fonction...voir la PHP docs.
Vous pouvez redémarrer la session en rappelant la fonction session_start() après session_write_close(). Cependant ce sera la cause de plusieurs PEID. - Je résoudre ce problème en supprimant les multiples SID de la tête avant de la sortie d'eau est tirée.
Voir cet exemple: https://gist.github.com/CMCDragonkai/6912726#file-nativesession-php-L254
Autres que d'utiliser session_write_close() ? Aucun, que je sache.
Il n'y a aucun moyen de désactiver les serrures de sessions php. C'est un vrai nighmare cas d'utilisation du verrouillage. Seul moyen de se débarrasser de séances et/ou php. Comme solution temporaire, vous souhaiterez peut-être utiliser riak gestionnaire de session: https://github.com/zacharyfox/riak-php-sessions c'est lock gratuit, et ça fonctionne.
Dernières versions de memcached gestionnaire de session a également introduit le verrouillage de certaines fou raisons et pas moyen de le désactiver.
Si PHP est de ne pas traiter les demandes de manière asynchrone même après l'appel de session_write_close, il peut juste être xdebug. Je ne sais pas si c'est votre problème, mais je reçois déclenché par cette conduite et de moi-même fou sur elle, donc je pensais que je poste, si quelqu'un d'autre ayant le même problème 🙂
C'est plutôt une vieille question, qui j'en suis venu à travers alors que des recherches sur les gestionnaires de session, cependant la réponse est oui, il est possible - mais pas en utilisant le gestionnaire par défaut (sans de profondes entailles dans le système de fichiers pour désactiver le verrouillage).
J'ai rencontré le même problème. La chose importante à noter est que vous devez vraiment savoir exactement les conséquences de la désactivation de verrouillage!
Ma solution est la partie d'une plus grande extension à la session d'un mécanisme de gestion - la Empilable Gestionnaire De Session qui inclut le stockage compatible avec le gestionnaire par défaut et (éventuellement) le non-blocage de la session de lectures et d'écritures.