сохранение объектов в php

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

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

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

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

спасибо

7 ответов


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


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

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


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

class SomeObject{

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

}

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

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

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

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

  2. всегда сериализовать и восстановить, как не сделали этого плохое поведение.

что когда-либо паруса вашей лодки. Делайте это при вашем собственном внимательном анализе. Гудлак!--5-->


сохранение данных в веб-программировании осуществляется через использование файлов 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);
    }
}

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

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

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