内存不足和允许的内存大小*字节耗尽之间的差异

时间:2012-11-22 09:21:09

标签: php mysql

我试图从MySQL表中获取数百万行到PHP我的应用程序。

获取数据的步骤如下所示。

  1. 使用mysql_query()或mysqli_query()发送查询到mySQL。

  2. 使用mysql_fetch_array()将结果设置为数组并循环每一行。或者使用mysqli_fetch_all()添加数组。

  3. 我将消息“内存不足”或“允许*字节耗尽的内存大小”。

    如果我改变'memory_limit',我或许可以解决它们。

    但我想知道为什么会显示这些消息。

    我已将'memory_limit'改为128M-> 512M - > 1024M。

    当我设置128M时,发送查询失败,允许的内存大小为* bytes耗尽,我无法将结果添加到数组区域。

    然后设置512M,查询成功完成但我无法将结果添加到允许*字节耗尽的内存大小的数组。

    最后设置1024M,发送查询和设置结果以将结果添加到数组都已完成。但有时mysqli_fetch_all()是带有内存不足的字段。

    我无法理解的一件事是为什么内存不会经常发生?

    我想知道的另一件事是如何从表中将整行超过一百万行转换为PHP减少内存转换。获取完整行后,我希望让我的用户通过浏览器操作访问它们,包括下载某些类型的文件,如csv。

2 个答案:

答案 0 :(得分:5)

当所需的内存量超过php.ini文件中指定的内存限制时,您将获得“允许的内存大小为* bytes exhausted”。

当服务器本身(或Apache或MySQL)内存不足时,您将获得“内存不足”。

答案 1 :(得分:1)

检索大量行的最佳选择是在查询中使用limitoffset并循环遍历它们。

这样可以防止您遇到的内存问题。