2010-02-18 70 views
1

加载新车型我目前通过重构我的一些代码争夺此错误消息:PHP在一个循环

Fatal error: Allowed memory size of 33554432 bytes exhausted

我想我必须某处有马虎的代码。它是一个不好的做法,在一个循环中加载新车型,像这样:

<?php 
foreach($blog_ids as $blog_id) { 
    $blog = new Blog($blog_id); 
    echo $blog->title; 
} 
?> 

这是一个快速的方式来刻录内存....如果是,我该如何完成同样的目标是什么?

编辑:

  1. 上面的代码只是一个代码段。我有很多关于每个博客的信息 - 模型应该是处理它的最好方法。

  2. 我可能在一个页面上最多有100个不同的博客列表。

+0

每个Blog对象有多大?崩溃之前得到多少次迭代?可能会有一种更有效的方法来抓取博客标题,而无需整个加载每个博客对象。 – thetaiko 2010-02-18 22:03:39

+0

需要更多的代码来调试并提供任何输入。我没有看到这个代码有任何明显的错误。 – Bart 2010-02-18 22:03:49

+0

感谢您的问题 - 我添加到上面 – johnnietheblack 2010-02-18 22:11:21

回答

2

您的$ blog变量每次都会被重用,所以PHP的垃圾回收器应该为您释放以前的Blog实例的内存。检查循环内部的memory_get_usage()以查看它是否不是。

+0

以前没有从内存中解脱出来,否则他不能打印博客标题。我想每次他完成工作后,他都应该在循环中调用__destructor手册 – streetparade 2010-02-18 22:25:14

+1

为什么他不能打印**当前**的博客标题,如果**之前的**是中解脱出来? – lamas 2010-02-18 22:34:26

1

我也有这个问题与我的模型,在那里我需要实例化他们很多,以获得每个记录一个或两个信息。

我的解决方案是创建一个Collection类,沿着这样的:

class BlogCollection 
{ 
    public function getTitles() 
    { 
     // select and returns just the titles of blogs 
    } 
} 

这样,你让你在一个集中的方式所需的信息并鸵鸟政策需要加载完整的模型只是为了获得一个或两个信息。

0

我不知道博客的构造函数中发生了什么,但我想你正在用数据库中的信息填充你的对象。

除了获取比您需要的更多信息(如果您只需要标题...),如果您最多可以显示100个条目,则可能还会进行大量的数据库访问。

我会做的是创建一个静态函数,一次获取所有标题集合(以及任何其他所需)并将其存储在数组中以便随后显示。