постоянство объекта в php - PullRequest
17 голосов
/ 23 ноября 2010

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

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

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

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

Спасибо

Ответы [ 7 ]

13 голосов
/ 23 ноября 2010

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

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

10 голосов
/ 23 ноября 2010

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

1 голос
/ 22 марта 2015

Хотя это может быть не самое красивое решение, но вы можете использовать SESSIONS для этого вопроса.

class SomeObject{

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

}

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

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

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

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

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

Что когда-либо плывет твоя лодка.Сделайте это на собственном внимательном анализе.Гудлак

0 голосов
/ 23 марта 2014

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

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

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

0 голосов
/ 05 февраля 2014

Прекратите использование 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);
    }
}
0 голосов
/ 23 ноября 2010

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

0 голосов
/ 23 ноября 2010

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

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