MySQL Daten versenden, bevor diese vollständig sind.
Cybie
- php
Hi!
Mein Problem ist folgendes: ich lade eine große Datenmenge mittels MySQL aus einer Datenbank und diese werden danach direkt ausgegeben.
sample.php:
<?
$result=mysql_query('SELECT daten FROM dateien WHERE name="meineDatei";');
$file=mysql_fetch_array($result);
echo $file['daten'];
?>
Solange die Datei klein ist, ist das kein Problem, aber wenn sie größer wird dauert der Transfer von MySQL zu PHP doch schon ein bisschen. Wenn die Übertragung dann fertig ist, wird _dann_ erst das ganze weitergereicht an den Klienten.
Zeitdiagram dazu (Achtung Milchmädchenrechnung! ;) )
|---[Zeit für MySQL->PHP]--[Zeit für PHP->Browser]--|
^
Lange Zeit
|---[Zeit für MySQL->PHP]-------|
|------[Zeit für PHP->Browser]--|
^
Kurze Zeit
Meine Frage daher, kann man es bewerkstelligen, dass die Daten, die ich von MySQL bekomme direkt weitergereicht werden?
Vielen Dank im Voraus und ich hoffe ich hab mich verständlich ausgedrückt ^^
Hello,
Meine Frage daher, kann man es bewerkstelligen, dass die Daten, die ich von MySQL bekomme direkt weitergereicht werden?
Standard-Gegenfrage: Wieso stehen denn die Daten überhaupt in der MySQL-Tabelle und nicht nur die Metadaten zum File?
Ein unbuffered Query könnte eventuell schneller gehen. Das habe ich aber noch nicht ausgetestet.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
echo $begrüßung;
Ein unbuffered Query könnte eventuell schneller gehen. Das habe ich aber noch nicht ausgetestet.
Nein, das glaube ich nicht. Das Ergebnis der Fetch-Funktion muss zuerst vorliegen, bevor es weiterverarbeitet werden kann. Ein echo fetch(); sind zwei separate Teile (behaupte ich jetzt einfach mal so). Ansonsten müsste PHP das Gesamtkonstrukt als Einheit ausgewertet haben, und schon während der Code der Funktion fetch() noch Daten holt schon eine Verbindung zum Code von echo aufgebaut haben, der dann die durchgereichten Datenhäppchen ausgibt. Soviel Intelligenz vermute ich im PHP-System nicht. Für wieviele Code-Konstrukte müsste man denn dann solche Querverbindungen einbauen und pflegen?
echo "$verabschiedung $name";
hi,
Solange die Datei klein ist, ist das kein Problem, aber wenn sie größer wird dauert der Transfer von MySQL zu PHP doch schon ein bisschen. Wenn die Übertragung dann fertig ist, wird _dann_ erst das ganze weitergereicht an den Klienten.
Wenn du die perverse Idee, Dateien in der DB abzulegen, noch weiter pervertieren willst - dann könntest du jeweils nur ein Teilstück auslesen (SUBSTRING o.ä.), dieses ausgeben und flushen, und dann das nächste ...
Also statt einer Query, die einen großen Batzen auf einmal holen soll, in einer Schleife mehrere Queries, die kleinere Stückchen holen.
Aber auch von Queries in Schleifen wird i.a.R. nicht umsonst abgeraten.
gruß,
wahsaga
Hello,
Wenn du die perverse Idee, Dateien in der DB abzulegen, noch weiter pervertieren willst - dann könntest du jeweils nur ein Teilstück auslesen (SUBSTRING o.ä.), dieses ausgeben und flushen, und dann das nächste ...
Also statt einer Query, die einen großen Batzen auf einmal holen soll, in einer Schleife mehrere Queries, die kleinere Stückchen holen.
Na das Stück Idee fehlte mir doch vorhin noch.
Ich konnte es mir gerade so verkneifen, einen ebenso perversen Beitrag zu leisten, aber jetzt kommt er.
Trenne das Holen der Daten und das Versenden an den Browser in mehrere Prozesse auf.
Dann kommen der Webserver und seine Brüder und Schwestern richtig ins Schwitzen...
Denn ob das reine Zerstückeln und portionsweise Flushen wirklich 'was bringen würde, wen sie von _einem_ Prozess kontrolliert werden, das bezweifele ich. Die Kontrolle wird erst an das nächste Statement übergeben, wenn das laufende abgearbeitet ist - oder?
Man kann aber sicher mit
select ... into outfile
was bewegen. Dann bekommt PHP die Daten gar nicht erst in den Buffer.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
hi,
Trenne das Holen der Daten und das Versenden an den Browser in mehrere Prozesse auf.
Und wie bringen wir Server oder Client bei, daraus das Ergebnis auf _einen_ HTTP Request zusammenzubasteln?
Denn ob das reine Zerstückeln und portionsweise Flushen wirklich 'was bringen würde, wen sie von _einem_ Prozess kontrolliert werden, das bezweifele ich. Die Kontrolle wird erst an das nächste Statement übergeben, wenn das laufende abgearbeitet ist - oder?
Ja - aber es entfiele der Teil, der im Moment vermutlich das Problem darstellt: Die Dauer, bis der Datenbrocken vom MySQL-Server an den PHP-Prozess übergeben wurde.
Man kann aber sicher mit
select ... into outfile
was bewegen. Dann bekommt PHP die Daten gar nicht erst in den Buffer.
Wenn der MySQL-Server über entsprechende Schreibrechte verfügt, in einem Verzeichnis, wo dann auch für den Client Zugriff über HTTP besteht ...
gruß,
wahsaga
Hello,
Trenne das Holen der Daten und das Versenden an den Browser in mehrere Prozesse auf.
Und wie bringen wir Server oder Client bei, daraus das Ergebnis auf _einen_ HTTP Request zusammenzubasteln?
Indem wir das Holen abtrennen, und dann das Auslieferen dem Vaterprozess überlassen.
Gemeinsame Menge sind die Dateien auf der Platte des lokalen Dateisystems
Ist ja sowieso nur alles Geblödel.
Aber das nennt man schließlich auch "Brainworking"
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo !
Meine Frage daher, kann man es bewerkstelligen, dass die Daten, die ich von MySQL bekomme direkt weitergereicht werden?
Du beschreibst nicht die Architektur in der die Funktionalität eingebettet ist, deshalb gehe ich mal davom aus dass Du
Sind meine ergänzenden Annahmen richtig ?
Falls nicht beschreib das System bitte genauer.
Wenn das so ist koenntest Du die zu grossen Tabellen nicht in mehrere kleine aufteilen und eine Benutzerführung in der Art "First/Previous/Next/Last" anbieten ?
Das beseitigt den Nachteil überlanger Ladezeit, beraubt den Benutzer allerdings auch der Möglichkeit selbst über dem kompletten Datenbestand zu suchen.
Ist das ein gangbarer Weg?
Gruesse
hkl
Vielen Dank im Voraus und ich hoffe ich hab mich verständlich ausgedrückt ^^