2013-03-22 2 views
5

Ich habe das seltsamste PHP-PDO-Problem, und ich hoffe, ihr könnt es für mich erledigen.Die PHP-PDO-Abfrage wird nicht ausgeführt, wenn LIMIT zu hoch ist?

Wenn ich $checkLimit auf 50000 festlegen, funktioniert die Abfrage einwandfrei. Allerdings, wenn ich es zu etwas über 50k setzen, wird es keine Ergebnisse zurück - und es macht werfen keine Fehlermeldungen entweder (Ich habe bereits eingeschaltet haben $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING) mit

$sql = " 
    SELECT d_domain_name AS domainName, d_domain_id AS domainID 
    FROM domains 
    ORDER BY d_domain_name_length ASC, d_domain_name ASC 
    LIMIT :checkLimit 
"; 
$stmt = $db->prepare($sql); 
$stmt->bindValue(':checkLimit', intval($checkLimit), PDO::PARAM_INT); 
$stmt->execute(); 
$results = $stmt->fetchAll(); 
foreach ($results as $result) { 
// 50k moments of magic 
} 

Wenn ich laufen. die Abfrage außerhalb von PHP, es funktioniert mit jedem Limit (auch 500k, dauert etwa 3 Minuten)

Ich habe versucht, $results = $stmt->fetchAll() zu while ($result = $stmt->fetch()) {} zu ändern, um zu versuchen, Speicher zu sparen, aber das tat nichts, leider .

Kann mir jemand sagen, was ich hier falsch mache? Was vermisse ich? Warum kann ich nicht über 50k gehen?

+0

Berücksichtigen Sie, dass 'int' Werte nicht unendlich sind, Sie haben möglicherweise eine Grenzwertnummer überschritten. – fedorqui

+2

Es ist nicht was? Lass uns nicht in der Schwebe! –

+0

@Fedorqui: 50.000 würde SEHR bequem in eine 32bit PHP int passen –

Antwort

4

Referenz: http://php.net/manual/en/mysqlinfo.concepts.buffering.php

PDO verwendet "gepufferte Abfrage" standardmäßig aktiviert.

Das bedeutet, dass die Abfrageergebnisse sofort vom MySQL Server an PHP übertragen werden und dann im Speicher des PHP-Prozesses gespeichert werden. .... Der Nachteil des gepufferten Modus ist, dass ein größeres Ergebnis Sets ziemlich viel Speicher benötigen kann. ....

Nach diesen Eigenschaften sollten gepufferte Abfragen in Fällen verwendet werden, in denen Sie nur eine begrenzte Ergebnismenge erwarten oder die Menge der zurückgegebenen Zeilen kennen müssen, bevor alle Zeilen gelesen werden. Unbuffered-Modus sollte verwendet werden, wenn Sie größere Ergebnisse erwarten.

50k ist ein großer Ergebnissatz. Könnten Sie versuchen, pdo ungepufferten Modus verwenden und holen Sie eine Reihe auf einmal? Dies ist das Beispiel, das aus der Referenz kopiert wurde. Die zweite Zeile stellt den ungepufferten Modus ein.

<?php 
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass'); 
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); 

$uresult = $pdo->query("SELECT Name FROM City"); 
if ($uresult) { 
    while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) { 
     echo $row['Name'] . PHP_EOL; 
    } 
} 
?> 
+0

schön, das ist interessant – Sebas

+0

Es funktioniert gut - außer dass ich keine neuen Abfragen innerhalb der Abfrage ausführen kann; 'Abfragen können nicht ausgeführt werden, während andere ungepufferte Abfragen aktiv sind. Erwägen Sie die Verwendung von PDOStatement :: fetchAll().Alternativ, wenn Ihr Code immer nur gegen mysql ausgeführt wird, können Sie die Abfragepufferung aktivieren, indem Sie das Attribut PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY setzen. –

+0

Können Sie versuchen, eine andere PDO-Verbindung zu derselben Datenbank für andere gepufferte Abfragen zu öffnen? –

Verwandte Themen