2011-04-08 31 views
1

我正在尋找一種方法來防止數據庫重複調用,如果有問題的項目已經被加載過。原因是我們有很多不同的區域顯示流行的項目,最新的版本,最受歡迎的項目等,有時會發生一個項目出現在同一頁面上的多個列表中。減少php網店的數據庫調用

我不知道是否有可能將對象實例保存在與類關聯的靜態數組中,然後檢查數據是否實際存在,但是如何將新實例指向現有的實例?

這裏是我的想法的草案:

$baseball = new Item($idOfTheBaseballItem); 
$baseballAgain = new Item($idOfTheBaseballItem); 

class Item 
{ 
     static $arrItems = array(); 

     function __construct($id) { 
      if(in_array($id, self::arrItems)){ 
       // Point this instance to the object in self::arrItems[$id] 
       // But how? 
      } 
      else { 
       // Call the database 

       self::arrItems[id] = $this; 
      } 
     } 
} 

如果您有任何其他的想法,或者你只是覺得我完全堅果,讓我知道。

+0

正如你所說這是受歡迎的物品,我想它對所有用戶都是一樣的,對嗎?然後,您可以將它緩存在XML或其他內容中,並且您的頁面將從XML讀取,這比查詢數據庫要快得多。您可以計劃您的應用更新XML的頻率。 – Andre 2011-04-08 12:49:11

+0

嗨安德烈,是的大多數列表確實是所有用戶相同。我不知道從文件讀取比查詢數據庫要快(這是MSSQL!),我一定會試一試。 – Alexis 2011-04-08 13:10:26

+0

是的,速度更快,因爲文件將按照您希望顯示的順序進行組織,使用的內存更少,並且您可以將數據庫移動到其他服務器而不會損失性能。順便說一句,我也會研究這個memcache類@Khez說。 – Andre 2011-04-08 14:22:16

回答

1

您應該知道,靜態變量只存在於它們創建的頁面中,這意味着加載相同頁面並獲得相同腳本的2個用戶仍然存在2個不同的內存空間。

你應該考慮緩存的結果,看看code igniter database caching

你所想要實現類似於單廠

$baseball = getItem($idOfTheBaseballItem); 
$baseballAgain =getItem($idOfTheBaseballItem); 

function getItem($id){ 
    static $items=array(); 
    if(!isset($items[$id])$items[$id]=new Item($id); 
    return $items[$id]; 
} 

class Item{ 
    // this stays the same 
} 

附:也看看memcache。刪除數據庫負載的一個非常簡單的方法是創建一個/ cache /目錄,並在那裏保存數據庫結果幾分鐘,或者直到您認爲數據是舊的(這可以通過多種方式完成,但大多數方法都是基於時間的)

+0

感謝您的直接解決方案。也歡呼指着我回到memcache,我會終於看到它。 – Alexis 2011-04-08 13:13:23

0

你不能在構造函數中直接替換「this」。相反,準備一個靜態函數,如「getById($ id)」,它從列表中返回對象。如上所述:這僅適用於每頁加載。