【问题标题】:stop PHP While loops and mySQL querys useing so much memory?停止使用这么多内存的 PHP While 循环和 mySQL 查询?
【发布时间】:2011-06-06 09:33:09
【问题描述】:

我注意到在 php/mysql 中反复处理大量数据时,浏览器的内存使用量会迅速增加。

例如,运行 firefox 4,打开单个选项卡,仅应用即时测试当前使用超过 800MB 的内存。

测试涉及通过 PHP while 循环从 mySQL 重复加载超过 500KB 的页面或 ajax 调用,我假设这是导致内存堆积?

有什么办法可以减少这种情况吗?

【问题讨论】:

  • 浏览器不受服务器上运行的任何东西的影响 - 只是受到服务器发送给它的数据的影响。究竟发送了什么?也就是说,Firefox 无缘无故吃掉 800 MB 并不是完全闻所未闻:)
  • 主要是来自mySQL的数据,周围有一些html。
  • FF 以存在使用过多内存的问题而闻名。在 Chrome 中试用您的代码。

标签: php mysql firefox


【解决方案1】:

解析更少的数据(并发送更少的 HTML),这是使用更少内存的唯一解决方案

无论如何检查内存的使用情况你可以使用memory_get_usage();

回复你的问题标题,停止while循环

while($r=mysql_fetch_*($query)) {
    if (memory_get_usage()>YOUR_LIMIT_BYTE_HERE)  {
        echo 'red alarm here';
        break;
    }

}

【讨论】:

  • memory_get_usage(); 在这种情况下是没用的;消耗 800 MB 的是网络浏览器。
  • @Jacco,基于他的脚本实现 memory_get_usage 可以监控将要发送的数据量。 (例如,如果他在内部存储所有返回的记录)。另外,如果您阅读他的标题,您就会明白为什么该功能很有用
  • memory_get_usage(); 报告调用时 PHP 引擎使用的内存。它与返回的数据集无关。至于你的更新,你应该使用memory_get_peak_usage();,否则你会得到意想不到的结果。您似乎真的在寻找$bytesSend = 0; while(yadayada){$bytesSend += strlen($r);}
  • @Jacco:如果您将整个数据集存储在您认为将存储它的数组中?
  • 您认为所有其他内容都存储在哪里?像您定义的常量或变量中的查询字符串? memory_get_peak_usage() 报告 PHP 引擎使用的最大内存量(包括函数、类、变量、常量、指针等),直到函数调用的时刻。 memory_get_usage() 报告相同,但不包括垃圾收集器释放的内存。所以是的,数组的大小确实会影响报告的内存使用量,但报告的内存使用量并不能反映数组使用的内存量。
【解决方案2】:

如果您通过 ajax 从 MySQL 返回 很多 条记录,那么是的,这很容易导致浏览器中的内存消耗增加。

根据您的浏览器及其对 Javascript 的实现,您可能还存在内存泄漏 - 这意味着即使在页面刷新之后,前一页分配的一些内存仍在使用中。只有关闭浏览器才能解决这个问题。

【讨论】:

    猜你喜欢
    • 2020-06-04
    • 2012-09-05
    • 2014-11-29
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多