Доброй ночи. Допустим имеем такие товары: 1. Сдается квартира 4-х комнатная 2. Продам телефон 3. Куплю самокат При первом же запуске приложения я сериализую все товары которые имеются в бд. и уже обращаюсь непосредственно к сериализованным данным. И в один прекрасный день, я удаляю из базы 1-ю запись. Вопрос: Как поступить в этом случае? Я сделал так, полностью удаляю сериализованные данные, потом заново сериализую. Но если призадуматься, со временем моя база разрастется, и там уже будет по больше трех записей, и не будет ли это накладно, каждый раз сериализовывать данные когда пользователь добавляет новые данные.
По крайней мере лучше, чем всю базу сериализовать в один файл. Если хочешь ускорить чтение, то можно кэшировать каждое объявление в отдельный файл при первом просмотре, или memcache вместо файлов (тогда не нужна сериализация).
Да. Но время на подключение к бд не в счет?)) Или никакой разницы нету? Тогда нафига придумали вообще сериализацию?)
В файликах думаю это уже прошлое, да и не удобно. Не то, чтобы тормозная. Я хотел узнать вариант хранения данных. правильно ли я делаю, или же есть варианты лучше. Кстати, все делал и без сериализации, чувствуется разница в скорости. Скажем это преждевременная оптимизация.
нет. я реально пытаюсь понять - суть задачи и суть твоего решения. я так понял: -все данные лежат в БД -при каждом запросе(или нет?) ты лезешь в эту БД, вытаскиваешь ВСЕ данные, сериализуешь их. -формирование страниц происходит на основе сериализованных данных. т.е. в БД ты больше не обращаешься? -в случае изменений данных, ты правишь их в сериализованном файле. и теперь думаешь как быть с БД?
При первом запуске приложения сериализую. в БД более не обращаюсь. правкой сериализованных данных не занимаюсь. Просто удаляю, и заново получаю данные из бд и сериализую. Далее обращаюсь к сериализованным данным. runcore, вроде старался как понятно расписать
понятно. для полностью статичного сайта, где данные обновляются очень редко и данных мало, допустимая схема. да, исключая вообще подключение к БД отклик страниц будет меньше. но таких сайтов щас почти не бывает. к тому же, при увеличении объема данных, доступ даже к сериализованным данным будет более долгим. ибо поиск и чтение внутри файла никуда не денется. и он явно не будет так оптимизирован как внутри БД. но. на среднестатистическом сайте, данные меняются очень часто. с каждым посещением. это всевозможная статистика посещений, счетчики, опросы, голосования, сессии, изменения данных аккаунта, и т.д. т.е. обновлять БД придется очень часто. тогда твоя схема будет только всё усложнять.
Хоть об этом я не упомянул, есть такое. Обращаться к бд приходится. Натолкнуло на мысль, переписал так, сериализую то что будет в этот момент просматриваться. т.е. в отдельный файлик. Тут уже не приходится удалять полность все объявления, при добавлении нового объявления, просто сериализую новое объявление, при удалении из базы, удаляю сериализованное объявление. параллельно делаю и на mamcache, с ним дело до этого не имел, теперь вижу, все довольно просто.
решил использовать MemCache класс обертка Код (PHP): <?php /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ namespace mahmuzar\base; class MemCache extends \MemCache{ private static $instance; public function __construct() { } static function instance() { if (!isset(self::$instance)) { self::$instance = new self(); } self::$instance->connect('mahmuzar', 11211) or die("Не могу подключиться"); return self::$instance; } static function setCached($key, $data = array()) { $news = new \stdClass(); $news->news = $data; self::instance()->set($key, $data, false, 999999) or die("Ошибка при сохранении данных на сервере"); } static function getCache($key) { return (array) self::instance()->get($key); } static function deleteCache($key) { self::instance()->delete($key); } } Добавлено спустя 2 минуты 26 секунд: Прошу критики. Особенно интересует момент коннекта к серверу memcache.
Получается, что он устанавливает коннект к мемкешу каждый раз, как ты вызываешь instance(). Нужно это перенести внутрь блока if. Далее, если ты делаешь класс для работы с мемкеш, то ты должен максимально отвязать его от своего приложения, никаких махмузаров в коннекте, приведения к массиву и прочего. Он просто должен уметь сохранять/забирать/удалять и всё, даже если ты вынесешь его в другое приложение. Ну и в качестве занудства. Над твоим классом должен быть ещё один класс Cache, который уже будет дергать твой мемкеш. Зачем это нужно? К примеру, если ты решишь заюзать редиску, то тебе достаточно будет подменить где-нибудь в настройках свой Memcache на свой же Redis (файлы, бд...) и всё остальное приложение будет работать так же как и раньше, потому что для него интерфейс для доступа к кэшу не изменится. Вот, тут хорошо описано: http://docs.phalconphp.ru/ru/latest/reference/di.html А вообще, в правильном направлении идешь ))
сделал, но думаю надо доделывать так, чтобы не было Fatal error или еще каких либо предупреждений. Т.е. если не удалось кэшировать, то он вытягивает все из базы. А пока, если нет подключения к серверу кэша все рушиться. Получается так и так он каждый раз коннектится к серверу. "mahmuzar" пока оставлю) А по поводу приведения, это потому что возвращался тип memcache поэтому пришлось привести к типу array ознакамливаюсь. Добавлено спустя 1 минуту 34 секунды: Код (PHP): <?php /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ namespace mahmuzar\base; class MemCache extends \MemCache { private static $instance; public function __construct() { } static function instance() { if (!isset(self::$instance)) { self::$instance = new self(); try { if (!self::$instance->connect('mahmuzar', 11211)) { throw new \Exception("Невозможно подключиться к серверу кэша"); } } catch (Exception $ex) { //В будущем надо реализовать ведение лог файла. //exit(); } } return self::$instance; } static function setCache($key, $data = array()) { $obj = new \stdClass(); $obj->data = $data; self::instance()->set($key, $data, false, 3600); } static function getCache($key) { return (array) self::instance()->get($key); } static function deleteCache($key) { self::instance()->delete($key); } }
Какой смысл бросать исключение, и тут же его ловить в том же методе? Вся прелесть исключения в том, что оно летит обратно по цепочке вызовов, пока не будет поймано. А если не поймано, то генерируется фатальная ошибка.