3

On my server I have the following error:

Allowed memory size of 268435456 bytes exhausted

This happens in a loop (a foreach one) and when I'm checking the memory usage in the loop with

memory_get_peak_usage();

I obtain 7254128 which is far from the 268435456 exhausted!

I checked at multiple places and the memory usage is not increasing wildly so I really don't know where the problem is!

The same script is working just fine on my local computer where I setted the memory limit to only 16M in my php.ini file

Here is the code causing the problem, but i think it won't be really usefull, it's from a plugin of question2answer open source plateform:

foreach ($badges as $slug => $info) {
    $badge_name=qa_badge_name($slug);
    if(!qa_opt('badge_'.$slug.'_name')) 
            qa_opt('badge_'.$slug.'_name',$badge_name);
    $name = qa_opt('badge_'.$slug.'_name');
}
4

1 回答 1

1

我强烈怀疑您的问题是由于标准 MySQL 连接器库中的“错误功能”造成的。当从数据库中获取包含“long blob”或“long text”字段的行时。MySQL 库不是分配数据所需的确切大小,而是尝试分配存储行可能需要的最大大小。即 4 GB 的内存。

解决此问题的最简单方法是切换到使用没有此“功能”的 MySQL ND 连接器

用于 SQL 查询的 PHP 大量内存使用

67108864 字节的允许内存大小已用尽

我正在使用 memory_get_peak_usage(); 检查循环中的内存使用情况;我得到的 7254128 远非 268435456 用尽!

那是对的。内存分配失败,因此峰值内存使用量永远不会显示使用中的巨大分配。

顺便说一句,您应该能够将错误消息跟踪到生成失败的内存分配错误的确切代码行。如果它不是源自 SQL 提取,那么答案可能是错误的。

于 2013-01-16T11:52:43.517 回答