За последние 24 часа нас посетили 17322 программиста и 1619 роботов. Сейчас ищут 1112 программистов ...

Кеширование

Тема в разделе "Прочее", создана пользователем kostyl, 18 сен 2009.

  1. kostyl

    kostyl Guest

    Когда то Кос просил кинуть что то в решения. Вот я написал у себя. Могу кинут в решения.
    (ps: сорри за черный пиар)
     
  2. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    kostyl
    У тебя удивительный код - вроде phpdoc, красивое форматирование, комментарии, но пока прочитаешь - глаз сломаешь ;-)
     
  3. kostyl

    kostyl Guest

    [vs]
    Рассцветка плохая или стиль наименования переменных?
     
  4. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    kostyl
    Расцветка хорошая, имена переменных из нескольких слов - это жестко =) Мне больше нравится, как обычно сокращают переменные в cpp
    Код (Text):
    1. $ExpiredPeriod
    2. $xpdPd
    3. $CallbackData
    4. $CbkDt
    а если писать длиные, то по мне так лучше писать их через подчеркивание
    Код (Text):
    1. $SoonFuseKeyPostfix
    2. $soon_fuse_key_postfix
     
  5. kostyl

    kostyl Guest

    [vs]
    ааа, да это последствия Delphi ;)
     
  6. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    как по мне, так через CamelCase — лучше. Но для переменных и методов лучше $lowerCamelCase.
    $SoonFuseKeyPostfix — честно, вообще не понимаю, что значит эта переменная. даже гугл выдал: "Вскоре предохранителей Ключевые Postfix" :))

    Подтвержу, что такое впечатление возникает. Может, не хватает какого-то подсознательного изящества , может всё дело в слишком длинных названиях:

    Код (Text):
    1. IsNeedCreateNewCache -> needNewCahce
    2. $ExpiredPeriod       -> $expires
    3. $SoonFuseKeyPostfix  ->$newPostfix
    PHP:
    1. <?
    2. if ($CallbackObject) {
    3.       self::$_CallbackSignature = array($CallbackObject, $CallbackFunction);
    4. }
    5. else {
    6.     self::$_CallbackSignature = $CallbackFunction;
    7. }
    8.  
    9. // =>
    10.  
    11. self::$_CallbackSignature = $CallbackObject ?
    12.     array($CallbackObject, $CallbackFunction) : $CallbackFunction;
    Плюс не хватает русских описаний в пхп-доке.

    Но намного красивее и приятнее смотреть на этот код, чем на код 95% осталных программистов.
     
  7. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    таки да, дело, скорее всего, в слишкомдлинныхназванияхпеременных
     
  8. kostyl

    kostyl Guest

    согласен, они длинноваты, надо поизящнее...
    Это все мой монитор, он может вмещать очень длинные строки, поэтому я не особо задумывался надо этим моментом, но я исправлюсь! ))
    $SoonFuseKeyPostfix - да, жестковато, жестковато...
     
  9. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    буду читать как поужинаю
     
  10. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    ну мне понравилось, спасибо) Некоторые моменты не понял (проверка подписи - эт че?)

    вот как у меня замешан кеш сейчас:
    PHP:
    1. <?php
    2.  
    3. abstract class Collections extends Creators
    4. {
    5.     protected $db;
    6.    
    7.     protected $cache;
    8.    
    9.     protected $params = array(
    10.         'fields'    => array('id', 'title'),
    11.         'from'      => 0,
    12.         'count'     => 10,
    13.         'orderBy'   => 'id',
    14.         'orderType' => 'DESC'
    15.     );
    16.    
    17.     protected $filter = false;
    18.    
    19.     protected function init()
    20.     {
    21.         $this->db = Database::getInstance();
    22.         $this->cache = Cache::getInstance();
    23.     }
    24.    
    25.     public function setPage($from, $count)
    26.     {
    27.         $this->params['from'] = $from;
    28.         $this->params['count'] = $count;
    29.        
    30.         return $this;
    31.     }
    32.    
    33.     public function order($field, $type)
    34.     {
    35.         $this->params['orderBy'] = $field;
    36.         $this->params['orderType'] = $type;
    37.        
    38.         return $this;
    39.     }
    40.    
    41.     protected function generateHash()
    42.     {
    43.         $fields = $this->params['fields'];
    44.         sort($fields);
    45.        
    46.         $filter = $this->filter;
    47.         $filter = (is_array($filter)) ? $filter : array();
    48.        
    49.         $str = get_called_class() . json_encode($fields) . json_encode($filter);
    50.         return md5($str);
    51.     }
    52.    
    53.     public function get()
    54.     {
    55.         $fields = func_get_args();
    56.         if (func_num_args() == 1 && is_array($fields[0]))
    57.             $fields = $fields[0];
    58.        
    59.         if ($fields) {
    60.             $defFields = $this->params['fields'];
    61.             $this->params['fields'] = array();
    62.             foreach ($fields as $field) {
    63.                 if (in_array($field = trim($field), $this->alowedFields))
    64.                     $this->params['fields'][] = $field;
    65.             }
    66.             if (!sizeOf($this->params['fields']))
    67.                 $this->params['fields'] = $defFields;
    68.         }
    69.        
    70.         $hash = $this->generateHash();
    71.         try {
    72.             $result = $this->cache->read($hash);
    73.         } catch (Exception $e) {
    74.             $result = $this->makeQuery();
    75.             $this->cache->write($hash, $result);
    76.         }
    77.        
    78.         return $result;
    79.     }
    80. }
    81.  
    Collections - возможно не совсем верное название. Его у меня используют NewsCollections extends Collections, ContentCollections, GoodsCollections (помните я писал про модуль News? вот это оттуда пошло) http://www.php.ru/forum/viewtopic.php?p=164456#164456

    как видно отсюда - кеш у меня очень глубоко зарыт. Кеш-машина - APC. Делать поддержку множества вариантов кеша нужно, но я не настолько богат временем.

    поддержки тегов нет. А нужно бы. Для меня в идеале было б именовать один и тот же кусок кеш-данных разными именами. Как бы ссылки на него. Ссылка по нескольким тегам и по ключу. Теги - для удаления при обновлении записей, ключ - для получения оного при разных выховах.

    Сколько можно символов выделить на именование кеша? Если будет тег=32 + ключ=32 + _ - нормально или черезчур много?
     
  11. kostyl

    kostyl Guest

    не понял о чем ты спросил
    вообще я советую делать так чтобы было удобно. Но всякое удобство обычно упирается в возможности. Вот в какие возможности упрутся твои 64 символа, я не знаю. По сути скажу что ИМХО это не много, но достаточно.
    у меня тоже кеш глубоко зарыт и в контроллере и в шаблонизаторе и в бд. Вообщем это нормально - если у двух человек (не у одного, а именно больше чему у одного) кеш зарыт глубоко. )))
     
  12. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    не понял о чем ты спросил
    CallbackSignature
     
  13. kostyl

    kostyl Guest

    CallbackSignature содержит в себе точку входа в процедуру, которая возвращает кешируемые данные данные. Так как это может быть как функция так и метод объекта, поэтому это сигнатура, ну а коллбэк думаю не надо объяснять. Или может я опять не понял? ))
     
  14. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    ответ понял. Прикольно, но мне понятнее через read/write.
     
  15. kostyl

    kostyl Guest

    Ну кто, как...
    Хочу добавить что благодаря Callback у меня политику хеширования возлагает на себя бєкенд, а у тебя непосредственно объект хеширования md5($str); ну это отдельная тема...
     
  16. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    да, это сделано специально ввиду сложности подсчета этого хеша. Ну не буду ж я передавать имя класса, $fields, $filters, ...
     
  17. kostyl

    kostyl Guest

    Это я чёто забредил. не правильно это.... Думаю сейчас о другом совсем))
     
  18. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    правильно, о сиськах!
     
  19. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    дык пятница же тем более.
     
  20. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ээ я не пойму, а в чём фишка то?
     
  21. kostyl

    kostyl Guest

    аха ))
     
  22. kostyl

    kostyl Guest

    какая фишка?