Уменьшить количество обращений к базе данных для php-магазина - PullRequest
1 голос
/ 08 апреля 2011

Я ищу способ предотвратить повторные вызовы в базу данных, если рассматриваемый элемент уже был загружен ранее. Причина в том, что у нас много разных областей, в которых отображаются популярные элементы, последние выпуски, рейтинг и т. Д., И иногда случается, что один элемент появляется в нескольких списках на одной странице.

Интересно, можно ли сохранить экземпляр объекта в статическом массиве, связанном с классом, а затем проверить, действительно ли там уже есть данные, но тогда как мне указать новый экземпляр на существующий?

Вот черновик моей идеи:

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

1 голос
/ 08 апреля 2011

Вы должны знать, что статические переменные существуют только на той странице, где они были созданы, то есть 2 пользователя, которые загружают одну и ту же страницу и получают один и тот же сценарий, по-прежнему существуют как 2 разных пространства памяти.

Вы должны рассмотреть результаты кэширования, взгляните на Кэширование базы данных воспламенителя кода

То, что вы пытаетесь достичь, похоже на фабрику синглтона

$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 / и сохранять там результаты базы данных в течение нескольких минут или пока вы не сочтете данные устаревшими (это можно сделать несколькими способами, но большинство подходов основаны на времени)

0 голосов
/ 08 апреля 2011

Вы не можете напрямую заменить это в конструкторе. Вместо этого подготовьте статическую функцию, такую ​​как «getById ($ id)», которая возвращает объект из списка. И, как указано выше: это будет работать только при загрузке страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...