За последние 24 часа нас посетили 11636 программистов и 1266 роботов. Сейчас ищут 452 программиста ...

сериализация

Тема в разделе "Прочие вопросы по PHP", создана пользователем mahmuzar, 7 июл 2015.

  1. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.633
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Доброй ночи.
    Допустим имеем такие товары:
    1. Сдается квартира 4-х комнатная
    2. Продам телефон
    3. Куплю самокат

    При первом же запуске приложения я сериализую все товары которые имеются в бд.
    и уже обращаюсь непосредственно к сериализованным данным.

    И в один прекрасный день, я удаляю из базы 1-ю запись.
    Вопрос: Как поступить в этом случае?


    Я сделал так, полностью удаляю сериализованные данные, потом заново сериализую. Но если призадуматься, со временем моя база разрастется, и там уже будет по больше трех записей, и не будет ли это накладно, каждый раз сериализовывать данные когда пользователь добавляет новые данные.
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.534
    Симпатии:
    623
    Как вариант, можно работать только с базой.
     
  3. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.633
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Думал об этом. Это будет лучше чем заниматься сериализацией каждый раз?
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.534
    Симпатии:
    623
    По крайней мере лучше, чем всю базу сериализовать в один файл. Если хочешь ускорить чтение, то можно кэшировать каждое объявление в отдельный файл при первом просмотре, или memcache вместо файлов (тогда не нужна сериализация).
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.162
    Симпатии:
    1.770
    Адрес:
    :сердА
    А что мешает создать таблицу для объявлений?
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.633
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Не совсем понятно какую именно таблицу.
     
  7. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    а какая цель данного действа?
     
  8. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.633
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    цель не обращаться постоянно к базе данных
     
  9. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    а сериализованные данные где хранятся? в каком месте выигрыш и в чем?
     
  10. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.633
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    жесткий диск лучше чем сервер бд, нет? я вроде почувствовал разницу в скорости.
     
  11. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    а БД где хранит данные? разве не на винте? ))
     
  12. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.633
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Да. Но время на подключение к бд не в счет?)) Или никакой разницы нету? Тогда нафига придумали вообще сериализацию?)
     
  13. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    а нафига тебе тогда вообще БД в твоей схеме, раз она такая тормозная?
    храни в файликах данные.
     
  14. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.633
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    В файликах думаю это уже прошлое, да и не удобно. Не то, чтобы тормозная.
    Я хотел узнать вариант хранения данных. правильно ли я делаю, или же есть варианты лучше. Кстати, все делал и без сериализации, чувствуется разница в скорости.

    Скажем это преждевременная оптимизация.
     
  15. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    нет. я реально пытаюсь понять - суть задачи и суть твоего решения.
    я так понял:
    -все данные лежат в БД
    -при каждом запросе(или нет?) ты лезешь в эту БД, вытаскиваешь ВСЕ данные, сериализуешь их.
    -формирование страниц происходит на основе сериализованных данных. т.е. в БД ты больше не обращаешься?
    -в случае изменений данных, ты правишь их в сериализованном файле. и теперь думаешь как быть с БД?
     
  16. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.633
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    При первом запуске приложения сериализую.
    в БД более не обращаюсь.
    правкой сериализованных данных не занимаюсь. Просто удаляю, и заново получаю данные из бд и сериализую. Далее обращаюсь к сериализованным данным.
    runcore, вроде старался как понятно расписать:)
     
  17. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    понятно. для полностью статичного сайта, где данные обновляются очень редко и данных мало, допустимая схема.
    да, исключая вообще подключение к БД отклик страниц будет меньше. но таких сайтов щас почти не бывает. к тому же, при увеличении объема данных, доступ даже к сериализованным данным будет более долгим. ибо поиск и чтение внутри файла никуда не денется. и он явно не будет так оптимизирован как внутри БД.

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

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.633
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Хоть об этом я не упомянул, есть такое. Обращаться к бд приходится.
    Натолкнуло на мысль, переписал так, сериализую то что будет в этот момент просматриваться. т.е. в отдельный файлик.
    Тут уже не приходится удалять полность все объявления, при добавлении нового объявления, просто сериализую новое объявление, при удалении из базы, удаляю сериализованное объявление.
    параллельно делаю и на mamcache, с ним дело до этого не имел, теперь вижу, все довольно просто.
     
  19. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.633
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    решил использовать MemCache
    класс обертка
    Код (PHP):
    1. <?php
    2.  
    3. /*
    4.  * To change this license header, choose License Headers in Project Properties.
    5.  * To change this template file, choose Tools | Templates
    6.  * and open the template in the editor.
    7.  */
    8.  
    9. namespace mahmuzar\base;
    10.  
    11. class MemCache extends \MemCache{
    12.  
    13.     private static $instance;
    14.  
    15.     public function __construct() {
    16.        
    17.     }
    18.  
    19.     static function instance() {
    20.         if (!isset(self::$instance)) {
    21.             self::$instance = new self();
    22.         }
    23.         self::$instance->connect('mahmuzar', 11211) or die("Не могу подключиться");
    24.         return self::$instance;
    25.     }
    26.  
    27.     static function setCached($key, $data = array()) {
    28.         $news = new \stdClass();
    29.         $news->news = $data;
    30.         self::instance()->set($key, $data, false, 999999) or die("Ошибка при сохранении данных на сервере");
    31.     }
    32.  
    33.     static function getCache($key) {
    34.        return (array) self::instance()->get($key);
    35.          
    36.     }
    37.  
    38.     static function deleteCache($key) {
    39.         self::instance()->delete($key);
    40.     }
    41.  
    42. } 
    Добавлено спустя 2 минуты 26 секунд:
    Прошу критики. Особенно интересует момент коннекта к серверу memcache.
     
  20. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.236
    Симпатии:
    1.716
    Адрес:
    Молдова, г.Кишинёв
    ну die заменить на выброс исключения
     
  21. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Что по твоему он делает? )
     
  22. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.633
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    что именно?)
     
  23. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Получается, что он устанавливает коннект к мемкешу каждый раз, как ты вызываешь instance(). Нужно это перенести внутрь блока if.

    Далее, если ты делаешь класс для работы с мемкеш, то ты должен максимально отвязать его от своего приложения, никаких махмузаров в коннекте, приведения к массиву и прочего. Он просто должен уметь сохранять/забирать/удалять и всё, даже если ты вынесешь его в другое приложение.

    Ну и в качестве занудства. Над твоим классом должен быть ещё один класс Cache, который уже будет дергать твой мемкеш. Зачем это нужно? К примеру, если ты решишь заюзать редиску, то тебе достаточно будет подменить где-нибудь в настройках свой Memcache на свой же Redis (файлы, бд...) и всё остальное приложение будет работать так же как и раньше, потому что для него интерфейс для доступа к кэшу не изменится.

    Вот, тут хорошо описано: http://docs.phalconphp.ru/ru/latest/reference/di.html

    А вообще, в правильном направлении идешь ))
     
  24. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.633
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    сделал, но думаю надо доделывать так, чтобы не было Fatal error или еще каких либо предупреждений. Т.е. если не удалось кэшировать, то он вытягивает все из базы. А пока, если нет подключения к серверу кэша все рушиться.
    Получается так и так он каждый раз коннектится к серверу.
    "mahmuzar" пока оставлю)
    А по поводу приведения, это потому что возвращался тип memcache поэтому пришлось привести к типу array
    ознакамливаюсь.

    Добавлено спустя 1 минуту 34 секунды:
    Код (PHP):
    1. <?php
    2.  
    3. /*
    4.  * To change this license header, choose License Headers in Project Properties.
    5.  * To change this template file, choose Tools | Templates
    6.  * and open the template in the editor.
    7.  */
    8.  
    9. namespace mahmuzar\base;
    10.  
    11. class MemCache extends \MemCache {
    12.  
    13.     private static $instance;
    14.  
    15.     public function __construct() {
    16.         
    17.     }
    18.  
    19.     static function instance() {
    20.         if (!isset(self::$instance)) {
    21.             self::$instance = new self();
    22.             try {
    23.                 if (!self::$instance->connect('mahmuzar', 11211)) {
    24.                     throw new \Exception("Невозможно подключиться к серверу кэша");
    25.                 }
    26.             } catch (Exception $ex) {
    27.                 //В будущем надо реализовать ведение лог файла.
    28.                 //exit();
    29.                 
    30.             }
    31.         }
    32.         return self::$instance;
    33.     }
    34.  
    35.     static function setCache($key, $data = array()) {
    36.         $obj = new \stdClass();
    37.         $obj->data = $data;
    38.         self::instance()->set($key, $data, false, 3600);
    39.     }
    40.  
    41.     static function getCache($key) {
    42.         return (array) self::instance()->get($key);
    43.     }
    44.  
    45.     static function deleteCache($key) {
    46.         self::instance()->delete($key);
    47.     }
    48.  
    49. }
    50.  
     
  25. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.534
    Симпатии:
    623
    Какой смысл бросать исключение, и тут же его ловить в том же методе? Вся прелесть исключения в том, что оно летит обратно по цепочке вызовов, пока не будет поймано. А если не поймано, то генерируется фатальная ошибка.