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

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

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

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

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

Спасибо

Ответы

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

class SomeObject{

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

}

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

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

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

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

Остановить использование однопоточного и использовать инъекцию зависимостей.

Лучший способ - использовать 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);
    }
}

Ответ 7

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

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

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