Heim >Backend-Entwicklung >PHP-Tutorial >Lösen Sie das Problem, dass AJAX-Anfragen die Antwortzeit von PHP zu lang machen
Mittlerweile haben wir viele Anwendungen entwickelt, die auf Ajax-Anfragen basieren. In einigen Fällen basieren sogar ganze Seiten auf Ajax. Manchmal stellen wir fest, dass die Antwortzeit von PHP sehr lang ist und der Antwortinhalt gleichzeitig zurückgegeben wird, wenn eine Webseite zwei oder mehr Ajax-Anfragen sendet.
Dieses Problem wird höchstwahrscheinlich durch die Art und Weise verursacht, wie Sie mit PHP-Sitzungen umgehen. Folgen Sie diesem Artikel, um dieses Problem zu verstehen und etwas zu tun, um es zu vermeiden.
Inhalt
Was ist das? eine PHP-Sitzung?
Um dieses Problem zu verstehen, ist es notwendig, zunächst PHP-Sitzungen und Ajax und deren Wechselwirkungen zu verstehen.
Angenommen, Sie entwickeln eine Webanwendung und möchten verschiedene Benutzer identifizieren. Sie möchten sich jedes Mal daran erinnern, wer alle Seiten besucht hat, ohne sich anzumelden. In diesem Fall können Sie Cookies oder Sitzungen verwenden.
Wie Sie vielleicht bemerkt haben, sind Sitzungen eine Möglichkeit, Benutzerinformationen zu speichern, die auf jeder Seite abgerufen werden können. Im Gegensatz zu Cookies werden Sitzungen auf dem Server gespeichert und kein Benutzer kann diese Informationen direkt ändern.
Standardmäßig sind Sitzungen gültig, bis der Benutzer den Browser schließt, oder sie laufen ab, nachdem der Benutzer für einen in der PHP-Konfigurationsdatei angegebenen Zeitraum inaktiv war.
Wenn Sie auf einer PHP-Seite Benutzerdaten speichern oder abrufen möchten, müssen Sie session_start() am Anfang der Seite aufrufen, damit Sie die Berechtigung haben, $_SESSION zum Abrufen von Sitzungsdaten zu verwenden.
Was ist Ajax?
Ajax steht für Asynchronous JavaScript and XML und ist eine Möglichkeit, Daten an den Server zu senden und von diesem zu empfangen, ohne die gesamte Seite neu laden zu müssen.
Auf diese Weise können wir Daten schneller senden und vom Server abrufen. Wir müssen nicht die gesamte Seite abrufen und im Browser rendern, da das langsam ist.
Daher können wir einen Teil der Seite aktualisieren und die Änderung für den Benutzer sichtbar machen, so wie ein Benutzer auf einer Facebook-Timeline-Seite nach unten scrollt, um zu sehen, was er sehen möchte, wenn neue Inhalte hinzugefügt werden, ohne die gesamte Seite neu laden zu müssen.
Spezifische Probleme
Die Entwicklung von Webanwendungen, die fast zu 100 % auf Ajax basieren, ist nichts Neues, aber wenn eine Webseite zwei oder mehr Ajax-Anfragen gleichzeitig sendet, werden Sie die Anfrage bemerken dauert lange und ist fast zeitgleich abgeschlossen.
Ursache
Wenn Sie möchten, dass der Server eine Ajax-Anfrage sendet, öffnet das PHP-Skript auch session_start() und sein Aufruf sperrt die PHP-Sitzungsdatei.
Wie Sie vielleicht bereits wissen, speichert PHP Sitzungsdaten standardmäßig in Dateien auf dem Server. Da nur eine PHP-Anfrage dieselbe Sitzungsdatei ändern kann, können zwei gleichzeitige PHP-Anfragen eine typische Dateisperrbedingung verursachen, sodass jede andere von PHP für denselben Benutzer aufgerufene session_start()-Anfrage warten muss, bis die erste Anfrage endet.
Jetzt verwenden die meisten PHP-Frameworks zuerst session_start() in der Hauptdatei. Wenn Sie daher ein Framework oder eine Bibliothek verwenden, die session_start() aufruft, führt dies zu einer Sitzungsdateisperre, die gleichzeitige Ajax-Anfragen an denselben Benutzer, der denselben Browser verwendet, verzögert.
Lösung des Problems
Der Aufruf der Funktion session_write_close() führt dazu, dass PHP die Sitzungsdatei schreibt und schließt, sodass nach der Freigabe der Sitzungsdatei eine weitere Anfrage erfolgt hat die Berechtigung zum Schreiben.
Nach dem Aufruf von session_write_close() wird das aktuelle Skript normal weiter ausgeführt, Sie sollten jedoch wissen, dass nach dem Aufruf von session_write_close() keine Sitzungsvariablen geändert werden dürfen Andere an PHP gesendete Anfragen können Sitzungsdateien sperren und Sitzungsvariablen ändern.
Damit Sie diese Art von Problem erkennen können, habe ich Testcode erstellt und ihn auf Github hochgeladen. Das Testskript finden Sie hier. Lokal müssen Sie eine Instanz verwenden, um den Testcode zu verwenden, und dann die Browserkonsole öffnen, um die Anforderungs- und Antwortzeiten anzuzeigen.
Wie wir im Beispielcode in dieser Datei sehen, wenn wir mehrere Anfragen wie den folgenden Code erstellen...
<code><span>session_start()</span>; <span>sleep(<span>5</span>)</span>;</code>
Jede Anfrage für denselben Benutzer wartet, bis die vorherige Anfrage abgeschlossen ist, bevor sie abgeschlossen wird. Es dauert 5 Sekunden, da die Sitzungsdatei erst freigegeben wird, wenn das Skript abgeschlossen ist. Daher werden beim ersten Aufruf von session_start() neue Anfragen blockiert. Das würde die Idee asynchroner Anfragen zunichte machen, d. h. mehrere Anfragen werden gleichzeitig gesendet und ausgeführt.
Wenn Sie den Code in der Datei ändern:
<code><span>session_start()</span>; <span>// do something useful here</span><span>session_write_close()</span>; <span>sleep(<span>5</span>)</span>;</code>
Die dritte Codezeile hebt die Sperre der Sitzungsdatei auf, sodass eine weitere gleichzeitige Anforderung ohne Wartezeit ausgeführt werden kann, da session_start() ohne Fragen aufgerufen werden kann .
Zusammenfassung
Es gibt etwas Subtiles an PHP, das Sie darüber beunruhigen lässt, warum seltsame Dinge passieren. Aber sobald man versteht, wie die Dinge funktionieren, ergibt alles einen Sinn und man kann besser über die Lösung von Problemen nachdenken.
Übersetzungsquelle: http://www.ido321.com/1577.html
Dieser Artikel wurde auf der Grundlage von @Eslam Mahmouds „Fix the AJAX Requests that Make PHP Take Too Long to Respond“ übersetzt. Die gesamte Übersetzung enthält mein eigenes Verständnis und meine eigenen Gedanken falsch Bitte fragen Sie auch Ihre Freunde aus der gleichen Branche um Rat. Wenn Sie diese Übersetzung erneut drucken möchten, geben Sie bitte die englische Quelle an: http://www.phpclasses.org/blog/post/277-Fix-the-AJAX-Requests-that-Make-PHP-Take-Too-Long- zu- Respond.html
Das Obige stellt vor, wie man das Problem der AJAX-Anfrage löst, die dazu führt, dass PHP zu lange braucht, um zu antworten. Ich hoffe, dass es Freunden, die sich für PHP-Tutorials interessieren, hilfreich sein wird.