Preloader für PHP?!

Hallo zusammen,
Preloader gibt’s wie Sand am Meer, leider habe ich bisher noch nichts für mein Problem gefunden.
Ich lade per PHP große Mengen aus MySQL um diese dann in verschiedenen Auswertungen anzuzeigen. Teilweise treten hier Ladezeiten von mehreren Sekunden, bis zu einer Minute auf.
Nun möchte ich das die Daten im Hintergrund geladen werden und der Nutzer solange eine Info sieht, dass die Daten geladen werden.

Die üblichen Wege (Layer ein- / ausblenden per JavaScript) funktionieren hier nicht, da die Seite auf dem Server (PHP) solange benötigt bis sie fertig ist.

Die MySQL-Tabellen sind alle entsprechend indiziert. Das ganze ist für den internen Gebrauch bestimmt.

Hat jemand ne Idee wie das umzusetzten ist (mir fällt z. Zt. nur Ajax ein, dafür müsste ich leider alle Seiten anpacken)

Danke für Tipps

Gruß

Marcel

P. S.
Serverumgebung:
Windows XP prof.
Apache 2.2
PHP 5
MySQL 5

Hi Marcel,

Die üblichen Wege (Layer ein- / ausblenden per JavaScript)
funktionieren hier nicht, da die Seite auf dem Server (PHP)
solange benötigt bis sie fertig ist.

Warum geht das nicht? Vor dem Laden den entsprechenden Code zum Einblenden des Layers per echo oder wie auch immer ausgeben, flush(), dann den restlichen JS-Code, welcher den Layer wieder ausblendet und Daten anzeigen.

Ciao
Rudy

Hallo Rudy,
also mit flush() hab ich’s noch nicht versucht.
Werde mir das mal ansehen.
Sehe ich das richtig, das alles vor flush() ausgegeben wird, und der Rest erst dann auf dem Server geparst wird?
Weil da ist ja das Problem, das parsen der Daten auf dem Server.

Danke schonmal,
werd’s morgen auf jeden Fall testen.

Gruß

Marcel

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Marcel,

mir scheint du brauchst kein preloader für PHP sondern für SQL? So wie ich dich verstanden habe dauert das Script deswegen solange weil große mengen aus der Datenbank gelesen werden.

Versuch es dochmal mit dem prepare methoden von mysqli?
http://de.php.net/manual/de/mysqli.prepare.php

Mich würden deine erfahrungen sehr interessieren, falls du es also auspobierst würde ich mich über einen kleinen bericht sehr freuen.

gelöst: Re^2: Preloader für PHP?!
Hallo Rudy,
vielen Dank, hab’s soeben mit flush() ausporobiert und es klappt wunderbar.
Werde noch ein wenig am Feinschliff basteln, aber soweit ist es genau das was ich gesucht habe.

Besten Dank und schöne Feiertage.

Gruß

Marcel

Hallo Indyk,
danke für deine Antwort. Genau genommen hast du Recht, die MySQL-Abfrage benötigt entsprechend ihre Zeit, hinzu kommt dann der Aufbau in PHP.

Ich habe das Problem nun mit der Idee von Rudy - flush() - gelöst, das funktioniert bei mir wunderbar.

Versuch es dochmal mit dem prepare methoden von mysqli?
http://de.php.net/manual/de/mysqli.prepare.php

Die Methoden von mysqli kenne ich noch überhaupt nicht, werde mir diese bei Gelegenheit aber auch mal ansehen.

Grüße und schöne Feiertag,

Marcel

Hi Marcel,

vielen Dank, hab’s soeben mit flush() ausporobiert und es
klappt wunderbar.

Schön, das freut mich. Wenn Du Probleme mit langen Wartezeiten bei Ausführung von mysql_query mit großen Resultsets hast, versuch es doch evtl. auch mal mit mysql_unbuffered_query, falls Du mit den resultierenden Einschränkungen leben kannst.

Besten Dank und schöne Feiertage.

Danke, Dir auch.
Rudy

Mit Javascript am sinnvollsten mit Ajax. Damit kannst du (je nachdem wie deine SQL abfragen ablaufen) eine Progressbar erzeugen und Teile nach und nacheinfügen.

Hi Rudy,
sorry das ich mich jetzt erst melde,
hab’s vorher nicht geschafft.

Wenn Du Probleme mit langen Wartezeiten
bei Ausführung von mysql_query mit großen Resultsets hast,
versuch es doch evtl. auch mal mit mysql_unbuffered_query,

Das hört sich auch klasse an,
hast du damit schon gearbeiter? Folgender Satz auf http://de.php.net/mysql_unbuffered_query irritiert mich:
„Ausserdem müssen Sie sicherstellen, dass Sie alle Datensätze des Ergebnisses einer ungepufferteten SQL Anfrage abgeholt haben. Erst dann können Sie eine neue SQL Anfrage an MySQL absetzen.“

Gilt das nur für den jeweiligen Client, oder bekomme ich Probleme wenn mehrer User zeitgleich auf MySQL zugreifen (müssen)?

Einsatzgebiet ist eine Intranetanwendung mit ca. 400 Usern.

Danke und Gruß

Marcel

Hallo Marcel,

Das hört sich auch klasse an,
hast du damit schon gearbeiter? Folgender Satz auf
http://de.php.net/mysql_unbuffered_query irritiert mich:
„Ausserdem müssen Sie sicherstellen, dass Sie alle Datensätze
des Ergebnisses einer ungepufferteten SQL Anfrage abgeholt
haben. Erst dann können Sie eine neue SQL Anfrage an MySQL
absetzen.“

Gilt das nur für den jeweiligen Client, oder bekomme ich
Probleme wenn mehrer User zeitgleich auf MySQL zugreifen
(müssen)?

Das gilt nur für den jeweiligen Client, also die jeweilige MySQL-Verbindung. Z.B. kannst Du nicht in der Ausgabeschleife, in der Du die Ergebnisse der mysql_unbuffered_query fetchst, mit der gleichen MySQL-Verbindung andere Selects durchführen (zuerst müsstest Du mysql_free_result machen, falls Du abbrechen möchtest). Bei vielen konkurrierenden Zugriffen würde mich eher stören, dass mysql_unbuffered_query die Tabelle lockt (nicht nur den Datensatz), das dürfte nicht sonderlich gut sein, wenn das nicht nur Lesezugriffe sind.

Einsatzgebiet ist eine Intranetanwendung mit ca. 400 Usern.

400 User sind viele :confused: Wenn dies wirklich alle potentiellen gleichzeitigen Nutzer sind, und die in die Tabellen auch schreiben wollen, würde ich mysql_unbuffered_query sein lassen. Wobei… kommt natürlich drauf an, wie lange die User sonst warten müssten und wieviel Performance-Gewinn die ungebufferte Abfrage bringt.

Ich gehe davon aus, dass Du sonst schon alle Optimierungen durch hast und die Wartezeit allein auf die Größe der ankommenden Datenmenge zurückzuführen ist. Indexe, SELECT-optimierung, Erstellung einer View für diese Abfrage hast Du bestimmt durch, sodass es nur mehr am Buffern der Results liegen kann?

Ciao
Rudy

Hallo Rudy,

Bei vielen konkurrierenden Zugriffen
würde mich eher stören, dass mysql_unbuffered_query die
Tabelle lockt (nicht nur den Datensatz), das dürfte nicht
sonderlich gut sein, wenn das nicht nur Lesezugriffe sind.

Ja das stimmt, das wäre bei dem Einsatzgebiet nicht sehr förderlich,
werde daher wohl die Option flush() aus PHP nutzen.

Ich gehe davon aus, dass Du sonst schon alle Optimierungen
durch hast […]. Indexe,
SELECT-optimierung, Erstellung einer View für diese Abfrage
hast Du bestimmt durch, sodass es nur mehr am Buffern der
Results liegen kann?

Teilweise, SELECT-Optimierung muss ich mich noch intensiver mit befassen, Indexe sind gesetzt und die ersten Views erstellt. Von Tag zu Tag kommen immer mehr Infos und Verbesserungsmöglichkeiten für mich zum Vorschein, so das da mit Sicherheit noch einiges rauszuholen ist.

Vielen Dank für deine ausführliche Hilfe und sorry das ich mich erst so spät gemeldet habe, bin in den letzen Tagen nicht dazu gekommen alles in Ruhe durchzugehen.

Gruß

Marcel