意外地使用单个PDO查询来触发PHP内存限制?

前端之家收集整理的这篇文章主要介绍了意外地使用单个PDO查询来触发PHP内存限制?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个非常简单的查询,看起来像:
$result = $pdo->query('SELECT * FROM my_table');

foreach($result as $r) {
    // do some stuff
}

但是当我运行这个我得到以下错误

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in /path/to/myfile.PHP on line 15

“第15行”是$pdo->查询行.

如果我在查询后放置了die(),我仍然会收到相同的错误.

我以为这只是在一时间拿到一排;为什么会使用这么多的内存?

Memory usage is 635384 bytes before calling query. I’m guessing query allocates in chunks,for each record.

丁丁丁!

当连接到MysqL时,PHP喜欢使用buffered queries.这是真的,无论你使用什么方法来连接.当使用缓冲查询时,当您询问时,整个结果集将立即获取,而不是被提取.这通常对于性能很好,因为往返次数较少.

但是像PHP中的所有东西一样,还有一个问题.如缓冲页面所述:

When using libMysqL as library PHP’s memory limit won’t count the memory used for result sets unless the data is fetched into PHP variables. With MysqLnd the memory accounted for will include the full result set.

你正在使用PHP 5.3,这意味着你很有可能使用MysqLnd.

您将要关闭缓存的查询.在MysqL的每个PHP接口中都有所不同:

>对于PDO,您需要将PDO :: MysqL_ATTR_USE_BUFFERED_QUERY属性设置为false.
>对于MysqLi,您需要将MysqLI_USE_RESULT常量传递给query方法.
>对于MysqL,您需要调用MysqL_unbuffered_query而不是MysqL_query.

详细信息和示例在页面上.

大肥胖无缓冲查询

您必须正确关闭语句句柄并释放结果集才能发出另一个查询

>在PDO中,这意味着在语句句柄上调用closeCursor.
>在MysqLi中,这意味着根据您正在使用的内容,在语句句柄或结果句柄上调用free_result.
>在MysqL中,这意味着调用mysql_free_result

否则将导致错误.

猜你在找的PHP相关文章