Ich verwende PHP, MySQL, Smarty, jQuery, AJAX usw. für meine Website. Momentan hole ich eine große Menge an Daten (passende Frage-IDs) aus der MySQL-Datenbank, bearbeite sie, ordnet diese Daten der Smarty-Vorlage zu und drucke sie auf einer Webseite. Da die Menge der Daten, die abgerufen werden sollen, zu groß ist und weiter verarbeitet wird, benötigt es zu viel Zeit, um die endgültigen Ausgabedaten zu erhalten. Im Gegenzug braucht es zu viel Zeit, um dem Benutzer ganze Daten anzuzeigen.
Ich habe einen Ansatz in meinen Gedanken, aber nicht in der Lage, ihn zu implementieren. Mein Ansatz besteht darin, die beiden Prozesse zum Abrufen des einzelnen übereinstimmenden question_id
auszuführen und gleichzeitig im Browser anzuzeigen und diesen Zyklus zu wiederholen, bis alle übereinstimmenden Fragen-IDs abgerufen und angezeigt werden. Wenn die geladenen Daten einer einzelnen Reihe angezeigt werden, sollte ein Laderbild unter diesem angezeigten Datensatz angezeigt werden. Wenn alle Daten gedruckt sind, sollte das Loader-Image verschwinden.
Aber das Hauptproblem, mit dem ich konfrontiert bin, ist, wie ich die Daten kontinuierlich der Smarty-Vorlage zuweisen und die Vorlage anzeigen soll, da die Smarty-Vorlagen-Engine zuerst den gesamten Inhalt lädt und erst nach dem vollständigen Inhalt im Browser ausdruckt .
Als Referenz verwende ich meinen gesamten Code aus Controller, Model und View:
Der PHP-Code von Controller (match_question.php) lautet wie folgt:
%Vor%Der PHP-Code von Model (QuestionMatch.php) lautet wie folgt:
%Vor%Der Code von View (match-question.tpl) lautet wie folgt:
%Vor%Danke, dass Sie Ihre wertvolle Zeit dafür aufgewendet haben, mein Problem zu verstehen.
Ich glaube, der Flaschenhals ist auf der Schleife über SQL-Abfragen. Es gibt eine Standardmethode zum Einstufen von Suchergebnissen in MySQL. Sie können einfach die Volltextsuche implementieren.
Zuerst müssen Sie eine Tabelle erstellen wie search_results
:
SQL:
%Vor% Sie müssen alle nützlichen Daten aus der Tabelle von questions
(einschließlich der Fragen, Themen, Antworten und was auch immer Sie durchsuchen wollen) in result_title und result_content hier einfügen (aktualisieren Sie diese Tabelle auch, wenn es nötig ist) Update sein). Es gibt auch eine Zurückspur zum ursprünglichen Datensatz der entsprechenden Tabelle in result_resource_id
. Mit einem vordefinierten URI result_uri
, der auf die definierte URL des Ergebnisses in Ihrer Website verweist, machen Sie alles schneller. Sie müssen die URL nicht jedes Mal neu erstellen.
Sie können jetzt eine einfache SQL-Abfrage für eine Suchanfrage 'question?'
in NATURAL LANGUAGE MODE
:
SQL:
%Vor%Sie können die Relevanzmessung auch zu Ihrer Abfrage hinzufügen. Es gibt andere Suchmodi wie Boolean. Lesen Sie die Dokumente hier und finden Sie die beste Lösung.
Die Volltextindizierung ist in diesen Anwendungsfällen schneller und auch genauer.
Im Allgemeinen laden Templating-Engines Inhalte nicht stückweise - Sie müssten Daten manuell in Blöcken an den Browser senden und flush
zwischen jedem Bit. Vorlagenbibliotheken erstellen normalerweise das gesamte Dokument im Speicher und speichern es dann auf einmal im Browser. Es lohnt sich jedoch, das Smarty-Handbuch zu überprüfen, nur für den Fall.
Alternativ können Sie die Seite ohne die große Datenmenge rendern und sie dann in Abschnitten über AJAX laden. Wenn man beispielsweise 10 AJAX-Verbindungen seriell einen kleinen zusätzlichen Overhead hinzufügt, klingt das im Vergleich zur aktuellen Renderzeit minimal. Obwohl die Renderzeit insgesamt etwas länger sein kann, wird die wahrgenommene Renderingzeit für den Benutzer viel schneller sein, und natürlich haben sie den Vorteil, dass Daten eintreffen können.
Ich würde die erste AJAX-Operation in jQuery bei domready starten, und wenn jede abgeschlossen ist, kann sie eine weitere Anfrage auslösen. Wenn Ihr Server in JSON statt in HTML antworten kann, kann der Server ein more_available
Boolesches Flag zurückgeben, mit dem Sie feststellen können, ob Sie einen weiteren Abruf durchführen müssen.
Angenommen, Sie möchten, dass Ihr Inhalt im Browser geladen wird, während er noch vom Server zum Client gestreamt wird. Wenn Sie - wie Sie - Tabellen verwenden, können Sie aufgrund von Layoutproblemen auf das Problem des Browsers stoßen ) nicht in der Lage sein, die Tabelle zu rendern, bis alle Daten geladen sind.
Sie können diese Tipps zum Erstellen von Schnelllade-HTML-Seiten sehen und lernen Sie Tabellen im entsprechenden Abschnitt kennen.
Einige entscheidende Punkte:
Wenn der Browser sofort die Höhe und / oder Breite Ihrer Bilder und Tabellen bestimmen kann, kann er eine Webseite anzeigen, ohne den Inhalt neu auffließen zu müssen. Dies beschleunigt nicht nur die Anzeige der Seite, sondern verhindert auch lästige Änderungen im Seitenlayout, wenn die Seite vollständig geladen ist. Aus diesem Grund sollten Höhe und Breite für Bilder angegeben werden, wann immer dies möglich ist.
Und:
Tabellen sollten die Kombination CSS
selector:property
verwenden:Tabellenlayout: behoben;
... und sollte Spaltenbreiten mit den COL- und COLGROUP-HTML-Tags angeben.
Sowie:
Tabellen gelten immer noch als gültiges Markup, sollten aber für die Anzeige tabellarischer Daten verwendet werden. Damit der Browser Ihre Seite schneller rendern kann, sollten Sie das Verschachteln Ihrer Tabellen vermeiden.
Vielleicht möchten Sie auch Methoden der Streaming-Ausgabe von PHP untersuchen.
Ihre aktuelle Datenbankabfrage und die nachfolgende Zuweisung von Smarty- & gt; ermöglichen kein langsames Laden von Daten, um den Prozess zu beschleunigen.
In dieser Situation können Sie eine maximale Anzahl von Zeilen aus Ihrer Abfrage identifizieren, die dem Benutzer schnell angezeigt werden können. Sobald Sie eine maximale Anzahl von Zeilen identifiziert haben, können Sie eine schnelle Antwortzeit anzeigen und beibehalten. Sie können Ihr Abfrage- und Vorlagensystem ändern, um eine Mehrfachabfrage zu berücksichtigen. Dies ist im Wesentlichen Seitenumbruch. Anstatt die Seiten zu paginieren, führen Sie eine erste Ladung von Zeilen aus und laden dann über jquery die letzte Gruppe von Zeilen, bis alle Datenseiten erfolgreich geladen wurden.
Dies führt zu einer größeren Anzahl von Abfragen an Ihre Datenbank, aber die Ladezeit der Seite wird für den Endbenutzer effizienter. Sie sollten also die Belastung der Maschine gegen die Benutzerfreundlichkeit für den Endbenutzer messen.
%Vor%Passen Sie Ihre Abfragefunktion an (ein Beispiel):
%Vor%Ich hoffe, diese Idee hilft Ihnen, eine Lösung zu finden. Prost!
Ohne auf die spezifischen Details Ihres Codes einzugehen, klingt das, wonach Sie suchen, etwas ähnlich dem von Facebook verwendeten System namens BigPipe, das in diese Notiz auf Facebook Engineering .
Im Grunde wird versucht, so schnell wie möglich eine Antwort an den Browser zu senden, die das grundlegende Layout der Seite und Platzhalterelemente enthält, die später den Inhalt enthalten, der länger lädt - sie rufen diese Pagelets auf. Nachdem die anfängliche Antwort gelöscht wurde, wird jedes Pagelet der Reihe nach geladen, einschließlich des Ladens von Daten aus Datenbanken oder Ähnlichem, und auch an den Client gesendet - immer noch Teil derselben HTTP-Anforderung. Javascript wird verwendet, um den Inhalt in den richtigen Platzhalter einzufügen.
In der Firma, in der ich arbeite, haben wir eine Weile damit experimentiert und großartige Ergebnisse erzielt. Es gibt eine Open-Source-Third-Party PHP / Javascript BigPipe-Implementierung auf GitHub , die wir als Ausgangspunkt verwendet haben. Es ist alles andere als trivial einzurichten und, was noch wichtiger ist, es funktioniert wirklich gut. Ich glaube, es ist eine großartige Lösung für genau die Art von Problemen, denen Sie gegenüberstehen.
Tags und Links php mysql ajax smarty output-buffering