2009-02-23 82 views
6

我遇到了PHP数据对象函数的一些严重问题。我试图通过使用缓冲查询循环一个相当大的结果集(〜60k行,〜1gig)来避免获取整个集合。PHP PDO缓冲查询问题

无论我做什么,该脚本只是挂在PDO :: query() - 它似乎查询运行无缓冲(为什么其他的结果集大小的更改会解决这个问题?)。这里是我的代码来重现问题:

如果我限制了一些合理数量的查询,它工作正常:

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

我试图与PDO :: MYSQL_ATTR_MAX_BUFFER_SIZE演奏和使用PDO :: prepare()和PDO :: execute()(尽管上面的查询中没有参数),都无济于事。任何帮助,将不胜感激。

回答

8

如果我理解这个权利,缓冲查询涉及告诉PHP,您希望在开始处理之前等待整个结果集。在PDO之前,这是默认设置,如果您想立即处理结果,则必须致电mysql_unbuffered_query

为什么这不在PDO MySQL驱动页面上解释,我不知道。

+0

哇还好我是个白痴。不知道是什么给了我相反的印象。 – Stewart 2009-02-23 19:52:04

+0

从技术上讲,“缓冲”查询意味着MySQL客户端库将整个结果集从TCP流中提取出来,然后再将其返回给您。 – staticsan 2009-02-24 06:13:39

1

你可以尝试它分成是不是大到足以引起问题大块:

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

...你的想法,反正。

-1

或者,也许你可以尝试MySQL的函数来代替:

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

这肯定会更快,因为这foreach语句让人印象使用fetchAll(),而不是fetch()每一行