постоянство объекта в php

Я довольно новичок в веб-программировании, я в основном использовал java для создания настольных приложений в прошлом.

Я пытаюсь понять, как создавать постоянные объекты в php. Возможно, постоянное это неправильное слово, я не хочу, чтобы объект был уникальным для каждого клиента, например, я получал бы его сериализацию в переменной сеанса. Я хочу, чтобы объект был создан на сервере и всегда был доступен тот же самый объект. Объект будет запрашивать базу данных и хранить некоторые данные. Таким образом, каждая загрузка страницы, php-код будет получать эти данные из одного и того же постоянного объекта, а не запрашивать базу данных каждый раз.

В настоящее время я использую шаблон singleton для создания объекта, потому что мое первоначальное понимание заключалось в том, что он позволит мне выполнить то, что я хочу. Часть объекта – это массив, и когда я выполняю php-страницу, которая добавляет значение в массив и получает доступ к этому значению на той же странице, это прекрасно. Однако, когда я добавляю значение к массиву и затем загружаю другую страницу, которая обращается к этому значению, массив возвращается к пустому.

Это возможно? Я слишком сильно реагирую, думая, что запрос к базе данных настолько плох? Время от времени будет доступно до 20 пользователей, запрашивающих данные в течение одной секунды, и я чувствую, что смешно запрашивать db каждый раз.

благодаря

Обычно вы получаете постоянство, используя базу данных. Если это узкое место, вы начинаете кэшировать данные, например, в memcached или, возможно, локальном файле с сериализованным массивом на вашем веб-сервере.

PHP не имеет концепции сохранения, как это делает Java: JVM позволяет Java-приложениям сохраняться в памяти между HTTP-запросами; веб-сервер разворачивает новый процесс PHP каждый раз, когда обслуживается новый HTTP-запрос, поэтому статические переменные объекта не будут сохранять данные для вас между запросами.

Используйте базу данных для хранения постоянных данных. Веб-программирование фокусируется на параллелизме, поэтому вам не стоит беспокоиться о запросах базы данных – всего 20 секунд. Если вы достигнете пределов своей базы данных, у вас есть возможность добавить кэш-уровень или «масштабировать» оборудование, добавив только ведомые только для чтения.

Хотя это не может быть самым красивым решением, но вы можете использовать СЕССИИ по этому вопросу.

class SomeObject{ public function __costructor{ $_SESSION['object'] = serialize($this); } } 

и на другой странице вы можете просто вызвать объект:

 $object = unserialize($_SESSION['object']); 

Хотя, конечно, этот подход кажется самым простым. Он должен быть предельно осторожным:

  1. Знайте, что сеансы в зависимости от трафика вашего сервера не должны быть слишком большими по размеру, так как многие пользователи одновременно запрашивают каждый из этих сеансов. Масштабируйте размер по своему усмотрению.

  2. всегда сериализуйте и несериализовывайте, поскольку сеансы, которые не выполняются, будут плохо работать .

То, что когда-либо парус вашей лодки. Сделайте это при своем внимательном анализе. удачи

Сохранение данных в веб-программировании осуществляется посредством использования файлов cookie / сеансов и передачи переменных cookie / сессии во время вызовов веб-страниц. Теоретически, любые данные могут храниться в этих переменных, но для большинства практических целей передаются только более важные данные (смотри их скорее как токены), необходимые для идентификации / восстановления необходимых объектов (с или без базы данных) и от сервера и браузера.

Я бы посоветовал вам хорошо взглянуть на memcached . Когда вы говорите о загрузке и производительности сервера, полезной метрикой часто является страница / секунда. Если у вас есть выделенный сервер и неоптимизированный, но очень интенсивный материал, вы можете выполнять только 5 страниц в секунду. Использование кэширования данных – отличный способ увеличить это в 3-10 раз. Тем не менее, это всегда компромисс, насколько устаревшие данные могут получить. Вам действительно нужно проверить свой сайт, чтобы правильно понять (количественно) другие возможные факторы, ограничивающие производительность, такие как другие соединения на странице (изображения, css и т. Д.), Файловый ввод / вывод, другую сетевую активность и, наконец,

Прекратите использование singleton и используйте инъекцию зависимости.

Лучший способ – использовать DataMapper ( http://www.martinfowler.com/eaaCatalog/dataMapper.html ) и прикрепить его к объекту с помощью динамических свойств. Пусть обработчик данных обрабатывает постоянство.

 $CS = new CookieStorage(); $SS = new SessionStorage(); $FS = new FileStorage('config/object.db'); $DM = new ObjectDataMapper($FS); $O = new Object($DM); $Object->DynamicProperty = 1; 

Теперь DynamicProperty будет автоматически сохраняться и будет автоматически загружаться из файла object.db . И определение класса:

 class Object { public function __construct(MapperInstance $Storage = NULL) { $this->setMapper($Storage?: new ObjectDataMapper(new FileStorage('config/object.db'))); } public function __get($name) { $this->_Mapper->getProperty($name); } public function __isset($name) { $this->_Mapper->isProperty($name); } public function __set($name, $value) { $this->Mapper->setProperty($name, $value); } } 

Можно хранить объекты в текущем сеансе. Теперь просто создайте базовый класс, который способен хранить и воссоздавать сам объект. Любой производный объект также будет постоянным.

Вы можете прочитать здесь: постоянный базовый класс и пример

Насколько я знаю, сессия хранится в ОЗУ и, следовательно, должна быть быстрее, чем сериализация объектов на диск для достижения настойчивости.