4

我正在尝试遍历数组中的数千个项目,执行一些操作并将一些值保存到 mysql 表中。

然而,当我循环时,内存使用量不断增长,直到我们用完我在 php.ini 中指定的内存,这非常快。

我尝试使用未设置,将变量设置为 null 并查看垃圾收集,但没有任何影响。

有没有更有效的方法可以循环遍历这些元素(即内存使用量不会持续增长)。

下面是我正在做的一个简化示例。

foreach ($subscribers as $subscriber)
{
    $member = new Member($subscriber['id']);
    if ($member['id'] > 0)
    {
        $bulletin = Bulletin::getCustomBulletin($member['id']);

        Bulletin::compileBulletin($member['email'], time(), $bulletin['title'], $bulletin['content']);

        echo $member['email'] . "\n";
        echo memory_get_usage() . "\n";
    }
}

这会产生以下结果:

an@email.com
11336688
an@email.com
12043640
an@email.com
12749952
4

3 回答 3

2

$suscribers数据库查询的结果吗?

如果是这样,它可能是您的问题的根源:行将被缓冲在内存中,即使您一次通过它们。

您可以尝试使用无缓冲查询或限制查询的结果数量并执行几个较小的查询。

另请参阅:为什么“允许的内存大小已用尽”?

于 2012-04-24T15:21:00.763 回答
0

您的foreach循环没有任何可疑之处(没有要取消设置的变量,因为它们都在每次迭代中被覆盖)。您将需要找出导致内存占用的行。在专业 IDE 中找到的分析器会对此有所帮助。如果您无法访问其中一个,您将希望照常使用memory_get_usage(),但将其放在每一行之后,以检查哪一个导致了瓶颈。

还有免费的分析工具,例如xdebug

于 2012-04-24T15:15:38.617 回答
0

不幸的是,很难从您发布的代码中看出,因为没有任何关于 Member 对象在内部做什么的线索,但这看起来是可能的:

递归引用泄漏内存

我将在上面的代码中消除新成员对象的创建,以检查这是否是内存泄漏的根源。从您所说的来看,无论如何创建成员对象可能都是不必要的,并且可以用静态查找成员函数替换它。

于 2012-04-24T15:30:47.657 回答