【问题标题】:Memory is leaking when I create models in a loop in FuelPHP当我在 FuelPHP 中循环创建模型时内存泄漏
【发布时间】:2014-07-24 18:03:17
【问题描述】:

我正在运行这样的代码

foreach ($set as $id)
{
    $user = Model_Users::find($id);
    $user = NULL;
}

每个循环都会增加内存消耗。太多不容忽视 - 每次大约 300Kb。迭代次数为数十万。

所以,有一个问题 - 我必须销毁或关闭什么来保持内存消耗水平?

【问题讨论】:

  • 实际上,我也注意到在我的一些代码中使用 ORM\Model 时,这种静态方法很慢,这就是为什么我将一些代码改为 DB::methods 类。跨度>
  • 不幸的是,我尝试了一个适当的模型,其中包含has_many、观察者和其他东西。放弃所有这些工作并重新开始将是很遗憾的。速度在这里不是问题。
  • 是的,我也是这么想的,不使用你已经在你的设置中的所有东西(关系、观察者等)是一种浪费。

标签: php memory-leaks fuelphp


【解决方案1】:

v1 ORM 缓存每个创建的模型。在循环中执行查询也不是最好的方法,就好像您有“数十万个”您将执行数十万个查询一样。

如果您要同时处理那么多行,您有两种选择。第一个是使用 DB 类来执行您的查询。第二个是一次以较小的批次运行循环。

我还可以建议使用IN 一次加载多个模型,从而将查询从循环中删除。

$users = Model_Users::find('all', array(
    'where' => array(
        array('id', 'IN', $set)
    )
);

【讨论】:

  • 嗯,你的答案唯一相关的部分是第一句话,但没有答案如何关闭它。其余的完全没用。为什么我不能使用 DB 已经在 cmets 中进行了解释,并且在循环中运行根本没有帮助。
  • 简短的回答是您不能轻易将其关闭。如果您使用 ORM 的 Query 对象,您可以使用 from_cache(false) 禁用缓存,或者您可以查看 Model 类的缓存对象属性以手动擦除它们。 github.com/fuel/orm/blob/1.8/develop/classes/model.php#L110 通常不建议将 ORM 用于此类大型数据集,因为水化过程非常缓慢,并且 ORM 提供的抽象通常不需要大量操作。并不是说您的情况就是这种情况。正如我还提到的,您可以查看分页。
  • 再一次 - 速度慢不是问题。该框架有一个命令行实用程序,旨在用于处理大型数据集。除了将通用模型作为数据的通用接口之外,这也是 ORM 理念的基石。如果你不能在需要时使用它,那么拥有一个包含关系、观察者和其他东西的模型有什么意义呢?我只需要关闭这个愚蠢的缓存。我已经做到了,通过清除您指出的这个变量,但恐怕是野蛮的方式。问题是为什么我不能轻易关闭它。
  • 我真的很抱歉回复的严厉,但出于某种原因,你总是试图摆脱这个话题,而是解决不存在的问题。这里太热了,这让我有点不适应。我很抱歉。
  • 不用担心,我们最好的人都会遇到这种情况。没有简单或“好”的方法存在的原因是最初构建代码时根本没有考虑到它。 v1 ORM 不是最好的写法,当你开始想做一些不是为它设计的事情时,它变得非常困难或不可能。通过 v2 重写,这是我们希望解决的问题。例如 v2 中的缓存,如果您想使用 memcache 或 w/e,您可以打开或关闭或完全关闭该功能
猜你喜欢
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多