Ответ 1
Обычно вы получаете постоянство, используя базу данных. Если это узкое место вы начнете кэшировать данные, например, в memcached или, возможно, локальный файл с serialized на вашем веб-сервере.
Я новичок в веб-программировании, в основном я использовал java для создания настольных приложений в прошлом.
Я пытаюсь понять, как создавать постоянные объекты в php. Возможно, постоянное это неправильное слово, я не хочу, чтобы объект был уникальным для каждого клиента, например, я получал бы его сериализацию в переменной сеанса. Я хочу, чтобы объект был создан на сервере и всегда был доступен тот же самый объект. Объект будет запрашивать базу данных и хранить некоторые данные. Таким образом, каждая загрузка страницы, php-код будет получать эти данные из одного и того же постоянного объекта, а не запрашивать базу данных каждый раз.
В настоящее время я использую шаблон singleton для создания объекта, потому что мое первоначальное понимание заключалось в том, что он позволит мне выполнить то, что я хочу. Часть объекта - это массив, и когда я выполняю php-страницу, которая добавляет значение в массив и получает доступ к этому значению на той же странице, это прекрасно. Однако, когда я добавляю значение в массив и затем загружаю другую страницу, которая обращается к этому значению, массив возвращается к пусту.
Возможно ли это? Я слишком сильно реагирую, думая, что запрос к базе данных настолько плох? Время от времени будет доступно до 20 пользователей, запрашивающих данные за одну секунду, и я чувствую, что смешно запрашивать db каждый раз.
Спасибо
Обычно вы получаете постоянство, используя базу данных. Если это узкое место вы начнете кэшировать данные, например, в memcached или, возможно, локальный файл с serialized на вашем веб-сервере.
PHP не имеет концепции сохранения, как это делает Java: JVM позволяет Java-приложениям сохраняться в памяти между HTTP-запросами; веб-сервер запускает новый процесс PHP каждый раз, когда обслуживается новый HTTP-запрос, поэтому статические переменные объекта не будут сохранять данные для вас между запросами.
Используйте базу данных для хранения постоянных данных. Веб-программирование фокусируется на concurrency, поэтому вам не следует беспокоиться о запросах базы данных - всего 20 секунд. Если вы достигнете пределов своей базы данных, у вас есть возможность добавить слой кеширования или "масштабировать" аппаратное обеспечение, добавив ведомые только для чтения.
Хотя это может быть не самое подходящее решение, но вы можете использовать СЕССИИ для этого.
class SomeObject{
public function __costructor{
$_SESSION['object'] = serialize($this);
}
}
а на другой странице вы можете вызвать объект просто:
$object = unserialize($_SESSION['object']);
Хотя, конечно, этот подход кажется самым простым. Он должен быть предельно осторожным:
Знайте, что сеансы в зависимости от трафика вашего сервера не должны быть слишком большими по размеру, так как многие пользователи одновременно запрашивают каждый из этих сеансов. Масштабируйте размер по своему усмотрению.
всегда сериализуем и несериализуем, поскольку сеансы, которые не выполняются, будут неверно.
То, что когда-либо плывет по вашей лодке. Сделайте это при своем внимательном анализе. Гудлак
Сохранение данных в веб-программировании выполняется с использованием файлов cookie/сеансов и передачи переменных cookie/сеанса во время вызовов веб-страниц. Теоретически, любые данные могут храниться в этих переменных, но для большинства практических целей передаются только более важные данные (смотри их скорее как токены), необходимые для идентификации/восстановления необходимых объектов (с или без базы данных) и от сервера и браузера.
Я бы посоветовал вам хорошо взглянуть на memcached. Когда вы говорите о загрузке и производительности сервера, полезной метрикой часто является страница/секунда. Если у вас есть выделенный сервер и неоптимизированный, но очень интенсивный материал, вы можете выполнять только 5 страниц в секунду. Использование кэширования данных - отличный способ увеличить это в 3-10 раз. Тем не менее, это всегда компромисс в отношении того, насколько устаревшие могут получить данные. Вам действительно нужно проверить свой сайт, чтобы правильно понять (количественно) другие возможные факторы, ограничивающие производительность, такие как другие соединения на странице (изображения, css и т.д.), Файловый ввод/вывод, другую сетевую активность и, наконец,
Остановить использование однопоточного и использовать инъекцию зависимостей.
Лучший способ - использовать 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);
}
}
Можно хранить объекты в текущем сеансе. Теперь просто создайте базовый класс, который способен хранить и воссоздавать сам объект. Любой производный объект также будет постоянным.
Вы можете прочитать здесь: постоянный базовый класс и пример
Насколько я знаю, сеанс хранится в ОЗУ и, следовательно, должен быть быстрее, чем сериализовать объекты на диск для достижения настойчивости.