2009-02-23 5 views
6

Ich habe einige ernste Probleme mit den PHP-Datenobjektfunktionen. Ich versuche, eine beträchtliche Ergebnismenge (~ 60.000 Zeilen, ~ 1gig) mit einer gepufferten Abfrage zu durchlaufen, um zu vermeiden, dass die gesamte Menge abgerufen wird.PHP PDO gepuffertes Abfrageproblem

Egal, was ich tue, hängt das Skript nur auf der PDO :: query() - es scheint, dass die Abfrage ungepuffert ausgeführt wird (warum sonst würde die Änderung in der Größe der Ergebnismenge das Problem beheben). Hier ist mein Code, um das Problem zu reproduzieren:

Wenn ich begrenzen die Abfrage mit einer vernünftigen Anzahl, es funktioniert gut:

$rQuery = $Database->query('SELECT id FROM mytable LIMIT 10'); 

Ich habe versucht, mit PDO :: MYSQL_ATTR_MAX_BUFFER_SIZE zu spielen und mit dem PDO :: prepare() und PDO :: execute() ebenfalls (obwohl es in der obigen Abfrage keine Parameter gibt), beide vergebens. Jede Hilfe wäre willkommen.

Antwort

8

Wenn ich das richtig verstanden habe, bedeutet das für gepufferte Abfragen, PHP mitzuteilen, dass Sie auf die gesamte Ergebnismenge warten wollen, bevor Sie mit der Verarbeitung beginnen. Vor PDO war dies die Standardeinstellung und Sie mussten mysql_unbuffered_query aufrufen, wenn Sie sofort mit Ergebnissen arbeiten wollten.

Warum dies nicht auf der PDO MySQL-Treiberseite erklärt wird, weiß ich nicht.

+0

Wow okay, ich bin ein Idiot zu verwenden . Ich weiß nicht, was mir den gegenteiligen Eindruck gemacht hat. – Stewart

+0

Technisch bedeutet eine "gepufferte" Abfrage, dass die MySQL-Client-Bibliothek das gesamte Resultset aus dem TCP-Stream zieht, bevor es an Sie zurückgegeben wird. – staticsan

+0

Hmm, ich dachte das Handbuch behandelt den Unterschied zwischen gepuffert/ungepuffert (mysql style) und fetch/fetchAll (PDO style), aber wenn ich es nochmal anschaue, dann nicht. Wenn Sie weitere Hintergrundinformationen wünschen, finden Sie unter Umständen folgendes: http://netevil.org/blog/2008/06/slides-pdo –

1

Sie könnten versuchen, es zu zerlegen in Stücke, die nicht groß genug sind, Probleme zu verursachen:

<?php  
$id = 0; 
$rQuery = $Database->query('SELECT id FROM mytable ORDER BY id ASC LIMIT 100'); 

do { 
    stuff($rQuery); 
    $id += 100; 
} while ($rQuery = $Database->query(
      'SELECT id FROM mytable ORDER BY id ASC LIMIT 100 OFFSET '.$id 
     ) 
     ); 
?> 

... Sie auf die Idee, sowieso.

-1

Oder vielleicht könnten Sie MySQL-Funktionen versuchen stattdessen:

while ($row = mysql_fetch_row($query)) { 
... 
} 

die auf jeden Fall schneller sein wird, da die foreach-Anweisung einen Eindruck macht fetchAll() statt fetch() jede Zeile

+1

mysql_-Funktionen sind veraltet und sollten nicht verwendet werden – vvondra