2013-03-22 16 views
5

Ho il più strano problema di PHP PDO, e spero che voi ragazzi possiate risolverlo per me.La query PDO di PHP non viene eseguita quando LIMIT è troppo alto?

Se ho impostato $checkLimit-50.000, la query funziona bene. Tuttavia, se ho impostato a qualsiasi cosa sopra 50k, non restituisce alcun risultato - e non gettato eventuali messaggi di errore o (li ho già acceso utilizzando $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING)

$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 
} 

Se corro. la query al di fuori di PHP, funziona con qualsiasi limite (anche 500k, dura circa 3 minuti).

ho provato a cambiare $results = $stmt->fetchAll() a while ($result = $stmt->fetch()) {} al fine di cercare di salvare la memoria, ma che non ha fatto nulla, purtroppo .

qualcuno può dirmi quello che sto facendo male qui? che cosa mi manca? Perché non posso andare oltre 50k?

+0

Prendere in considerazione i valori di 'int' non sono infiniti, potresti aver ottenuto un numero oltre il limite. – fedorqui

+2

Non è quello che? Non lasciarci in sospeso! –

+0

@fedorqui: 50.000 si adatterebbe molto comodamente in un 32bit PHP int –

risposta

4

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

DOP utilizza "interrogazione tamponata" per impostazione predefinita.

Ciò significa che i risultati della query vengono immediatamente trasferiti dal server MySQL a PHP in viene quindi conservato nella memoria del processo PHP. .... L'aspetto negativo della modalità buffer è che grandi risultati set potrebbe richiedere un po di memoria molto. ....

Dopo queste caratteristiche, è necessario utilizzare le query bufferizzate nei casi in cui si prevede solo un set di risultati limitato o è necessario conoscere la quantità di righe restituite prima di leggere tutte le righe. La modalità senza buffer deve essere utilizzata quando si prevedono risultati più grandi.

50 k è un grande set di risultati. Potresti provare a let DOP utilizzare la modalità senza buffer e recuperare una riga alla volta? Questo è l'esempio copiato dal riferimento. La 2a riga imposta la modalità senza buffer.

<?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

nice, che è interessante – Sebas

+0

Funziona alla grande - tranne che non riesco a eseguire nuove query all'interno della query; 'Non è possibile eseguire query mentre sono attive altre interrogazioni non bufferizzate. Prendi in considerazione l'utilizzo di PDOStatement :: fetchAll().In alternativa, se il codice verrà eseguito solo su mysql, puoi abilitare il buffering delle query impostando l'attributo PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY. –

+0

Potresti provare ad aprire un'altra connessione pdo alla stessa banca dati per altre query memorizzate nel buffer? –

Problemi correlati