PHP PDO Buffered sorgu sorunu

3 Cevap php

Ben PHP Data Object fonksiyonları ile bazı ciddi sorunlar yaşıyorum. Ben bütün set getiriliyor önlemek için bir tampon sorgu kullanarak büyükçe bir sonuç kümesi (~ 60k satırlar, ~ 1gig) döngü çalışıyorum.

Ne olursa olsun ben ne, komut sadece PDO :: sorguya asılı () - bu sorgu (? Neden başka olurdu sonuç kümesi boyutunda değişim 'düzeltme' sorunu) tamponsuz çalışıyor görünüyor. Burada sorunu yeniden oluşturmak için benim kod:

<?php
$Database = new PDO(
    'mysql:host=localhost;port=3306;dbname=mydatabase',
    'root',
    '',
    array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
    )
);

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

// This is never reached because the result set is too large
echo 'Made it through.';

foreach($rQuery as $aRow) {
    print_r($aRow);
}
?>

Ben bazı makul numarası ile sorgu sınırı ise, iyi çalışıyor:

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

Ben PDO :: MYSQL_ATTR_MAX_BUFFER_SIZE ile oynarken ve PDO kullanarak denedim :: (hazırlamak () ve PDO :: yürütme) hem de (yukarıdaki sorgusuna parametre vardır gerçi), boşuna hem de. Herhangi bir yardım mutluluk duyacağız.

3 Cevap

Ben bu hakkı anlamak, tamponlu sorgular size işleme başlamadan önce belirlenen tüm sonuç için beklemek istiyorum söylüyorum PHP içerir. Önce PDO için, bu varsayılan ve aramak zorunda mysql_unbuffered_query hemen sonuçları ile uğraşmak istedim.

Bu PDO MySQL sürücüsü sayfasında açıklanmıştır değil, neden bilmiyorum.

Sen sorunlara neden olacak kadar büyük değil parçalar halinde o kadar bölünmüş deneyebilirsiniz:

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

... Neyse, fikir olsun.

Ya da bunun yerine mysql fonksiyonları deneyebilirsiniz:

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

Bu foreach deyimi bir izlenim fetchAll() yerine fetch() her satır kullanmak için yapar bu yana kesinlikle daha hızlı olacak