Heim >Backend-Entwicklung >PHP-Tutorial >PHP-Sitzung kann Parallelitätsprobleme verursachen
Bei der Entwicklung von Webanwendungen verwenden Benutzer häufig Sitzungen zum Speichern von Daten. Einige Leute wissen jedoch möglicherweise nicht, dass in PHP die unsachgemäße Verwendung von Session zu Parallelitätsproblemen führen kann. Kishan Gor, leitender Ingenieur bei Plus91 Technologies, einem Anbieter von Softwarelösungen für die indische Medizinindustrie, erläuterte dieses Problem in seinem persönlichen Blog.
Wenn derselbe Client mehrere Anfragen gleichzeitig sendet und jede Anfrage eine Sitzung verwendet, führt das Vorhandensein der PHP-Sitzungssperre dazu, dass der Server auf diese Anfragen seriell statt parallel antwortet. Dies liegt daran, dass PHP standardmäßig Dateien zum Speichern von Sitzungsdaten verwendet. Für jede neue Sitzung erstellt PHP eine Datei und schreibt weiterhin Daten in diese. Daher wird bei jedem Aufruf der Methode session_start() die Sitzungsdatei geöffnet und die exklusive Sperre der Datei erhalten. Wenn das Serverskript eine Anfrage verarbeitet und der Client eine Anfrage sendet, die auch Session verwenden muss, wird auf diese Weise die letztere Anfrage blockiert, bis die vorherige Anfrage verarbeitet und die exklusive Sperre für die Datei aufgehoben wird. Dies ist jedoch nur auf mehrere Anfragen desselben Clients beschränkt, d. h. Anfragen eines Clients blockieren nicht Anfragen eines anderen Clients.
Dies ist normalerweise kein Problem, wenn das Skript kurz ist. Wenn die Ausführung des Skripts jedoch lange dauert, kann es zu Problemen kommen. In der modernen Webanwendungsentwicklung kommt es sehr häufig vor, dass mithilfe der AJAX-Technologie mehrere Anfragen zum Abrufen von Daten auf derselben Seite gesendet werden. Wenn diese Anfragen alle die Verwendung von Session erfordern, wird die Session-Sperre erworben, nachdem die erste Anfrage den Server erreicht hat, und andere Anfragen müssen warten. Alle Anfragen werden seriell verarbeitet, auch wenn sie keine Abhängigkeiten voneinander haben. Dadurch wird die Reaktionszeit der Seite deutlich erhöht.
Es gibt eine Möglichkeit, dieses Problem zu vermeiden, nämlich die Methode session_write_close() aufzurufen, um die Sitzung sofort nach der Verwendung zu schließen. Auf diese Weise wird die Sitzungssperre aufgehoben, auch wenn das aktuelle Skript noch auf die Verarbeitung wartet. Es ist zu beachten, dass das aktuelle Skript nach dem Aufruf dieser Methode die Sitzung nicht weiter betreiben kann.
Es ist zu beachten, dass die in diesem Artikel dargelegten Probleme und Meinungen nur für den standardmäßigen PHP-Sitzungsverwaltungsmodus unter Verwendung der session_start()-Methode gelten. Einige Benutzer wiesen beispielsweise darauf hin, dass das Problem der Sitzungssperre nicht auftritt, wenn die Anwendung auf AWS EC2 gehostet wird und DynamoDB korrekt konfiguriert ist.