Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
减少php web shop的数据库调用_Php_Oop_Caching - Fatal编程技术网

减少php web shop的数据库调用

减少php web shop的数据库调用,php,oop,caching,Php,Oop,Caching,我正在寻找一种方法,以防止重复调用数据库,如果有问题的项目已经加载之前。原因是我们有很多不同的区域显示热门项目、最新版本、最高评级等,有时一个项目出现在同一页面的多个列表中 我想知道是否有可能将对象实例保存在与类关联的静态数组中,然后检查数据是否确实在其中,但是如何将新实例指向现有实例 以下是我的想法草案: $baseball = new Item($idOfTheBaseballItem); $baseballAgain = new Item($idOfTheBaseballItem)

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

我想知道是否有可能将对象实例保存在与类关联的静态数组中,然后检查数据是否确实在其中,但是如何将新实例指向现有实例

以下是我的想法草案:

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

如果你有任何其他想法,或者你认为我完全疯了,让我知道。

你应该知道静态变量只存在于它们创建的页面中,这意味着加载相同页面并获得相同脚本的两个用户仍然作为两个不同的内存空间存在

你应该考虑缓存结果,看看

您试图实现的目标类似于一个单件工厂

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

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

您应该知道静态变量只存在于创建它们的页面中,这意味着加载相同页面并获得相同脚本的两个用户仍然作为两个不同的内存空间存在

你应该考虑缓存结果,看看

您试图实现的目标类似于一个单件工厂

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

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

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

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

正如您所说的,这是一个受欢迎的项目,我想这对所有用户都是一样的,对吗?然后,您可以将其缓存在XML或其他格式中,页面将从XML中读取,这比查询数据库快得多。您可以安排应用程序更新XML的频率。您好,Andre,是的,大多数列表对于所有用户都是相同的。我不知道从文件读取比查询数据库快(它是MSSQL!),我一定会尝试一下。是的,它更快,因为文件将按您希望的顺序组织,使用更少的内存,并且您可以将数据库移动到另一台服务器而不损失性能。顺便说一句,我还将研究这个memcache类@Khez说。正如你所说的,它是受欢迎的项目,我想它对所有用户都是一样的,对吗?然后,您可以将其缓存在XML或其他格式中,页面将从XML中读取,这比查询数据库快得多。您可以安排应用程序更新XML的频率。您好,Andre,是的,大多数列表对于所有用户都是相同的。我不知道从文件读取比查询数据库快(它是MSSQL!),我一定会尝试一下。是的,它更快,因为文件将按您希望的顺序组织,使用更少的内存,并且您可以将数据库移动到另一台服务器而不损失性能。顺便说一句,我还将研究这个memcache类@Khez说。谢谢你的直截了当的解决方案。同时也为我指出memcache而欢呼,我将最终研究它。谢谢你的直截了当的解决方案。也为我回到memcache而欢呼,我将最终调查它。