减少php网上商店的数据库调用

时间:2011-04-08 12:42:01

标签: php oop caching

我正在寻找一种方法来防止重复调用数据库,如果之前已经加载了相关项目。原因是我们有很多不同的领域,显示热门项目,最新版本,最高评级等。有时会发生一个项目出现在同一页面上的多个列表中。

我想知道是否可以将对象实例保存在与该类关联的静态数组中,然后检查数据是否实际存在于那里,但是如何将新实例指向现有实例呢?

以下是我的想法草稿:

 $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;
          }
      }
 }

如果您有任何其他想法或者您认为我完全疯了,请告诉我。

2 个答案:

答案 0 :(得分: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
}

P.S。另请查看memcache。删除数据库负载的一种非常简单的方法是创建/ cache /目录并在那里保存数据库结果几分钟或直到您认为数据已经过时(这可以通过多种方式完成,但大多数方法都是基于时间的)

答案 1 :(得分:0)

您无法在构造函数中直接替换“this”。相反,准备一个静态函数,如“getById($ id)”,它从列表中返回对象。 如上所述:这仅适用于每页加载。