Frage

Bei der Arbeit haben wir fast alles in Java und Perl, aber ich wollte ein Feature mit PHP und Sitzungen bauen. Einige lugen dachte, dass es eine schlechte Idee, zu versuchen, war PHP-Sessions auf unserem System zu tun, weil es zu viele Server verteilt wird. Was wäre das spezifische Problem sein?

War es hilfreich?

Lösung

PHP speichert seine Sitzungen in Dateien auf dem Dateisystem

Die Antwort auf Ihre Frage, was das Problem sein würde, liegt in der Tatsache, dass in der Standardeinstellung. Für einen einzelnen Webserver Anfragen dienen, ist dies kein Problem, da Ihre Sitzungsdaten immer verfügbar sein wird. Aber was, wenn Sie hatte zwei Lastausgleich webservers dient Anfragen?

Stellen Sie sich den ersten Webserver mit einem Antrag treffen, die Ihre Session-Datei auf dem Dateisystem erstellt. Dann Ihre nächste Anforderung trifft den zweiten Webserver. Der zweite Webserver wird natürlich finden Sie in der Sitzungsdatei nicht. Für den Benutzer, können Sie auf eine Website anmelden, und dann angemeldet sein, plötzlich aus.

Dies ist kein spezifisches Problem für PHP, und ist sehr verbreitet. Die Lösung ist die Sitzungsdaten in einem gemeinsamen Bereich zu speichern. Die gebräuchlichste Methode hierfür ist die Sitzungsdaten zu speichern, entweder in einer Datenbank zugänglich für all Web-Server, oder einen Shared-Memory-Cache-Server wie Memcached.

Andere Tipps

Sie können auch eine benutzerdefinierte Session Save Handler verwenden:

http://www.php.net/ manual / en / function.session-set-save-handler.php

Ich habe noch nie versucht, aber damit Sie definieren Ihr eigene speichern / Lesefunktionen, so dass Sie eine Datenbank oder einen gemeinsamen nfs-Backend, ohne dass alle Erweiterungen installieren implementieren können.

Auch msession, die von @Eran Galperin vorgeschlagen wurde, sieht sehr interessant als Alternative zu der, die ich bereits erwähnt.

Persistierende Sitzungen über mehrere Server (auch als Session-Clustering) ist ein weit verbreitetes Problem für Web-Anwendungen Skalierung und ist in PHP nicht spezifisch. PHP hat mehrere Lösungen bieten, um damit zu umgehen, wie die Zend Platform (kommerzielle Anwendungsserver) und msession (Erweiterung).

Ganz vagee Frage, aber ich würde sagen, das Problem größer ist als in den Antworten erwähnt. Natürlich können Sie außer Kraft setzen, wie das Laden und Speichern von Cookies, aber es gibt eine Kosten es auch. Zum Beispiel, haben Sie die folgenden Szenarien / Fragen zu berücksichtigen:

  • Wenn Sie die Cookies setzen auf einen anderen Host, wie wird dies die Geschwindigkeit Ihrer Cookies beeinflussen? Das offensichtlich hängt davon ab, wie viele schreibt / liest die Sie machen.
  • Machst du diese Geschwindigkeit zu erhöhen oder Failover haben? Die Antwort wird auf jeden Fall zu unterschiedlichen Lösungen führen:
    • Falls Sie dies für Failover tun, wie werden Sie damit umgehen, wenn Ihr Webserver (n) nicht Ihren Session-Speicher zugreifen, da die Netzwerkverbindung nach unten geht? Was passiert, wenn Ihre Session-Speicher untergeht? Sie werden dies eine Art von Master-Master-Replikation zu lösen, möglicherweise ausgeführt, dass Session-Speicher auf dem gleichen Rechner wie der Webserver für extra hohe Verfügbarkeit verteilt (wenn alle Sitzungen in dem Speicher passen können). Hier finden Sie aktuelle Riak oder ähnlich für Master-Master-Replikation.
    • Falls Sie tun dies einfach für Geschwindigkeit, würde ich Apache, nginx verwenden oder (schnellsten) haproxy einfach Load-Balancing zu tun, basierend auf Client-IP-Adresse. Auf diese Weise müssen Sie nicht die Mühe machen, ein verteiltes Session-Speicher mit der Einrichtung. Sicher, wenn einer Ihrer PHP-Instanzen gehen Sie Ihre Benutzer ihre Cookies verlieren werden, aber vielleicht ist das kein Problem. Es liegt an dir.

einfachste ist Memcached oder redis.

Hier ist, wie es in redis zu tun - wir es im Moment verwenden: http://redis4you.com/articles.php ? id = 001 & name = Redis + als + Session + Handler + in + PHP

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top