我有一个非常简单的查询,类似于:
$result = $pdo->query('SELECT * FROM my_table');
foreach($result as $r) {
// do some stuff
}但是,当我运行这个程序时,我会得到以下错误:
致命错误:允许在第15行/path/ to /myfile.php中耗尽内存134217728字节(尝试分配32个字节)
“第15行”是$pdo->query行。
如果我将die()放在查询之后,仍然会得到相同的错误。
我以为这一次只能取一行,为什么要用这么多内存呢?
发布于 2012-12-05 18:15:19
调用查询之前,内存使用量为635384字节。我猜查询是按块分配的,为每个记录分配。
丁仃丁!
当连接到MySQL时,PHP喜欢使用缓冲查询。无论您使用何种方法连接,都是正确的。当使用缓冲查询时,会立即获取整个结果集,而不是当您询问时被获取。这通常对性能有好处,因为往返旅行较少。
但是,就像PHP中的所有东西一样,也有一个问题。正如缓冲页面中所指出的:
当使用libmysql作为库时,PHP的内存限制不会计算用于结果集的内存,除非数据被提取到PHP变量中。使用mysqlnd,内存将包含完整的结果集。
您正在使用PHP5.3,这意味着很有可能使用mysqlnd。
您需要在这里关闭缓冲查询。它在MySQL的每个PHP接口中都是不同的:
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY属性设置为false。MYSQLI_USE_RESULT常量传递给query方法。mysql_unbuffered_query而不是mysql_query。详细信息和示例都在页面上。
大胖无缓冲查询抓到你了!
在发出另一个查询之前,必须正确关闭语句句柄并释放结果集:
closeCursor。free_result或结果句柄上的free,这取决于您使用的是什么。mysql_free_result如果不这样做,将导致错误。
https://stackoverflow.com/questions/13728106
复制相似问题