2010-02-18 71 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個條目,則可能還會進行大量的數據庫訪問。

我會做的是創建一個靜態函數,一次獲取所有標題集合(以及任何其他所需)並將其存儲在數組中以便隨後顯示。