2010-03-26 18 views
10

Ich möchte PDO in meiner Anwendung verwenden, aber vorher möchte ich verstehen, wie intern PDOStatement->fetch und PDOStatement->fetchAll.Wie funktioniert PHP-PDO intern?

Für meine Anwendung möchte ich etwas wie "SELECT * FROM myTable" tun und in csv-Datei einfügen und es hat rund 90000 Zeilen von Daten.

Meine Frage ist, wenn ich PDOStatement->fetch benutzen, wie ich es hier bin mit:

// First, prepare the statement, using placeholders 
$query = "SELECT * FROM tableName"; 
$stmt = $this->connection->prepare($query); 

// Execute the statement 
$stmt->execute(); 
var_dump($stmt->fetch(PDO::FETCH_ASSOC)); 

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) 
{ 
echo "Hi"; 
// Export every row to a file 
fputcsv($data, $row); 
} 

wurde nach jedem aus der Datenbank holen, ergeben sich für das wäre im Speicher ablegen holen?

Bedeutung, wenn ich zweite holen, Speicher hätte Daten des ersten Abrufs sowie Daten für den zweiten Abruf.

Und so, wenn ich 90000 Zeilen von Daten habe und fetch jedes Mal als Speicher aktualisiert wird, um neue Fetch-Ergebnis zu nehmen, ohne Ergebnisse aus früheren Abruf zu entfernen und so für den letzten Abruf Speicher hätte 89999 Zeilen von Daten .

  1. Funktioniert das wie PDOStatement::fetch funktioniert?
  2. Leistung weise, wie funktioniert dieser Stapel gegen PDOStatement::fetchAll?

Update: Etwas über zu holen und fetchAll von Speicherauslastung Sicht

einfach etwas, was auf diese Frage hinzugefügt wollte erst etwas gefunden in Bezug auf Abruf und fetchAll, hoffen, dass dies würde diese Frage lohnt Für Leute würde diese Frage in Zukunft besuchen, um ein Verständnis für fetch und fetchAll Parameter zu bekommen.

Fetch speichert keine Informationen im Speicher und es funktioniert Zeile für Zeile, also würde es durch die Ergebnismenge gehen und Zeile 1 zurückgeben, als würde wieder zur Ergebnismenge gehen und dann wieder Zeile 2 Geist hier, dass zurück es wird nicht Zeile 1 und 2 zurückgeben, sondern würde nur Zeile 2 zurückgeben, also wird Fetch nichts im Speicher speichern, aber fetchAll speichert Details in den Speichern. Daher ist fetch im Vergleich zu fetchAll eine bessere Option, wenn es sich um eine resultierende Menge von ungefähr 100 KB handelt.

+0

Ist diese Frage klar oder benötigt sie noch weitere Informationen? – Rachel

Antwort

3

PHP behält seine Ergebnisse im Allgemeinen auf dem Server. Alles hängt vom Fahrer ab. MySQL kann in einem "ungepufferten" Modus verwendet werden, aber es ist ein bisschen schwierig zu verwenden. fetchAll() auf einem großen Ergebnissatz kann Netzwerküberflutung, Speichererschöpfung usw. verursachen.

In jedem Fall, in dem ich mehr als 1.000 Zeilen verarbeiten muss, verwende ich nicht PHP. Berücksichtigen Sie auch, ob das Datenbankmodul bereits über eine CSV-Exportoperation verfügt. Viele tun es.

0

Ich rate Ihnen, PDO::FETCH_LAZY anstelle von PDO::FETCH_ASSOC für große Datenmengen zu verwenden. Ich habe es für den Export in CSV Zeile für Zeile verwendet und es funktioniert gut. Ohne "out of memory" -Fehler.

+0

Dies ist mehr ein Kommentar als eine Antwort, die ich sagen würde. – hakre

Verwandte Themen