Wie lade ich die Daten ab und zeige sie gleichzeitig in einem Browser mit PHP und Smarty an?

8

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.

    
PHPLover 07.12.2013, 09:22
quelle

5 Antworten

10

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 :

erstellen

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.

    
Mehdi 12.12.2013, 01:27
quelle
7

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.

    
halfer 07.12.2013 10:00
quelle
7

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.

Siehe diese Frage für Details .

    
SquareCat 07.12.2013 09:27
quelle
6

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.

Für match_question.php

  • Fragen Sie zuerst Ihre Datenmenge ab, um zu sehen, wie viele Datenzeilen Sie insgesamt haben.
  • Teilen Sie diese Zeilen durch die Gesamtzahl der Zeilen, die Sie anzeigen können, während Sie eine schnelle Anwendung beibehalten. Dadurch erhalten Sie die Gesamtzahl Ihrer "Seiten" oder "Abfragen", die Sie ausführen werden.
  • Beispiel: Sagen Sie, dass Ihre Tests 100 Zeilen als optimale schnellste Antwort ergeben. Sie würden einen COUNT (*) auf dem erwarteten Datensatz ausführen, der 2021 zurückgibt. Sie würden diese Zeilenanzahl durch Ihre optimalen 100 Ergebnisse teilen, was 20,21 oder 21 "Seiten" oder in Ihrem Fall 21 Gesamtabfragen ergeben würde. Ihre erste anfängliche Abfrage und 20 zusätzliche Ajax-Abfragen.
  • 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%

Für die QuestionMatch.php

  • Passen Sie Ihre Abfragefunktion an (ein Beispiel):

    %Vor%

Für Ansicht (match-question.tpl)

  • gib den 'page_count' Wert in einem html Element aus, vielleicht einen Datenseiten html5 Wert und weise es einem Element mit einer eindeutigen ID zu.
  • Beim Laden der Seite initialisiere deinen ajax und nimm den Datenseiten-Wert.
  • rufen Sie Ihr php-Dokument über Ajax mit der? page = & amp; subject_id = & amp; topic_id =
  • Durchlaufen Sie den Ajax-Aufruf mit den Datenseiten ab Seite = 2, bis Sie die Max-Seiten abgefragt haben.
  • fügen Sie bei jeder Iteration gegebenenfalls den zurückgegebenen HTML-Code hinzu.

Ich hoffe, diese Idee hilft Ihnen, eine Lösung zu finden. Prost!

    
Pynt 09.12.2013 16:46
quelle
5

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.

    
Aistina 15.12.2013 21:47
quelle