Frage

Okay, hier ist einer für die Profi:

Seit ein paar Jahren arbeite ich an meiner eigenen PHP -oder ActiveCord -Implementierung, die ich genannt habe Pork.dbobject.

Es basiert locker auf dem Film "Make Your Own Your Own Site mit Rails in 5 Minuten", den wir alle vor ein paar Jahren gesehen haben. Sie können Dinge wie:

$clients = dbObject::Search("Client", array("ID > 500")); 

oder

$client = new Client(218); // fetch row with id 218 from client table

oder

$projects = $client->Find('Project');

Dadurch wird eine oder mehrere Zeilen aus der Datenbank abgerufen, sie in ein DBObject wickeln und in einem Array zurückgeben oder false zurückgeben, dass es keine Ergebnisse gibt.

All dies hat perfekt in Dutzenden von Websites und Backends gearbeitet, aber jetzt verwendet mein Kollege ihn, um einen riesigen LogParser zu erstellen, und startet hier die Gedächtnisnutzungsprobleme.

Die Fragen, die er ausführt, können über 20.000 Zeilen zurückkehren, vielleicht sogar noch mehr, was natürlich keine sehr gute Sache ist, in eine Objektverpackung auf einmal zu wickeln und als einzelnes Array zurückzukehren.

Die offensichtliche Lösung wäre, ein Objekt zurückzugeben, das das implementiert Iterator Schnittstelle statt eines Arrays. Es sollte nicht alle Datensätze aus dem Ergebnisset sofort abholen, sondern nur die Ergebnisressource für die generierte Datenbankabfrage und verwenden Sie mySQL_Fetch_* intern, wenn Sie das Objekt so durchqueren, als wäre es ein Array.

Jetzt kommen wir zu meiner wirklichen Frage: Kann ich ohne Probleme das einfach einfach tun? Können Datenbanken mehrere offene Ergebnissen verarbeiten und mischen und für eine Weile im Speicher halten?

Zum Beispiel 20 Objekte holen, sie schleifen und jeden dieser 20 5 anderen abrufen, wich nach wie vor 3 andere. Dies würde eine Schleife erzeugen, in der eine Reihe verschiedener Ergebnisgriffe im Speicher gehalten werden.

Ich weiß, dass ich eines dieser Objekte nicht serialisieren kann, aber werde ich dies ohne Probleme in PHP5 implementieren oder die Datenbankschnittstellen geben mir Probleme?

War es hilfreich?

Lösung

Dies hängt davon ab, welche Datenbank Sie verwenden und Ihre Datenbankkonfiguration.

Für MySQL müssen Sie sicherstellen, dass Sie gepufferte Abfragen verwenden. In PDO setzen Sie es so:

$myPdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

Dies bedeutet, dass alle Daten an den Client gesendet werden (nicht das gleiche wie das Abrufen von alles in PHP).

Die andere (wahrscheinlich schlechtere) Alternative besteht darin, eine neue Datenbankverbindung zu öffnen, wenn Sie eine Abfrage erkennen, die mit einem noch geöffneten Ergebnis ausgeführt wird.

Das Normale mysql_query() Verwendet eine gepufferte Abfrage, sodass mit mehreren Ergebnissätzen funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top