Pull to refresh
1
0
Ярослав @frantic

User

Send message
Symfony очень удобный и производительный фреймворк. Даже метафреймворк. На его базе можно создавать множество различных приложений. В том числе и фреймворков. Например, Silex.

Есть просто некоторые вещи, которые неудобно делать. А именно, проекты где контент меняется в зависимости от авторизации пользователя. Причем когда этого контента много. Как в случае с хабром. И то это проблема больше реализации кэша, чем самого Symfony. Ничто не мешает написать свою оболочку.
Конечно, можно. В моем случае хоть и не идентичные, но очень схожие.
Там и там последние публикации с одинаковым набором данных: заголовок, автор, блог.
Естественно это сравнение приблизительно!
А можно подробнее? Я не понял, что вы имеете ввиду.
http://dvjournal.ru/
Мое хобби. Первый проект на Symfony2. Дизайн и программирование — моё. Еще и пишу статьи.
Очень интересная ситуация!

Из access.log
87.250.254.242 - - [30/Nov/2010:23:59:56 +0300] GET /slovo/poizi/671.htm HTTP/1.1 "200" 4240 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/ "-"

* This source code was highlighted with Source Code Highlighter.


Из моего кэтчера пауков:
Nov 30 23:59:56 symfony [err] [Yandex] Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots) [If-Modified-Since: Tue, 23 Nov 2010 02:59:34 GMT][<хост>/slovo/poizi/671.htm]

* This source code was highlighted with Source Code Highlighter.


Код кэтчера такой:
$pattern = '/(google)|(yandex)|(scooter)|(stack)|(aport)|(lycos)|(fast)|(rambler)/msi';

    if(isset($_SERVER['HTTP_USER_AGENT']) && preg_match($pattern, $_SERVER['HTTP_USER_AGENT'], $out))
    {
      $bot = self::$se[strtolower($out[0])];
      $agent = $_SERVER['HTTP_USER_AGENT'];

      $message = '['.$bot.'] '.$agent.' [If-Modified-Since: '.(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : 'no').']['.$request->getUri().']';
      sfContext::getInstance()->getLogger()->err($message); 
    }


* This source code was highlighted with Source Code Highlighter.


Получается робот все спрашивает как надо!

  • 50 кг веса – требуется 3000 калорий
  • 68 кг веса – требуется 3400 калорий
  • 77 кг веса – требуется 3850 калорий
  • 86 кг веса – требуется 4300 калорий
  • 95 кг веса – требуется 4800 калорий
  • 104 кг веса – требуется 5300 калорий


Это примерный показатель. Его можно увеличивать примерно на 25%. Тут уже стоит экспериментировать.
Источники,
Арнольд Шварценеггер: секреты атлетического режима,
Что я делаю не так? 10 ошибок в фитнесе

У моего друга есть следующая программа тренировок:
всю рабочую неделю есть обезжиренный творог без всяких добавок, например сахара. Иногда вместо творога, можно есть фасоль, гречку или куриные грудки. Но в основном творог. В день примерная норма 1 кг творога. Есть не сразу, а желательно каждые 2-3 часа.
На выходных есть все что душе захочется и в любых количествах.

Автор молодец. Написать за 2 недели сервер и клиент, да еще с учетом масштабирования. Плюс дизайн сделать (хоть не супер, но все же хоть что-то).
Я как разработчик проникся уважением.
Многопоточные сервера писать это вам не плюшки в магазине покупать.

Эх, мне бы такую производительность.

пошла реклама конкурентов ))))
это не пиар. это просто сказка. веселая такая сказка. я ее когда писал ржал как конь ))))

написал я ее потому, что проект этот стало приятно разрабатывать. поделился радостью так сказать.

а тех подробностей на хабре и так хватает )
конечно ) просто ни одного не зарегистрировано. Мелочь, а приятно )))
какой смысл рекламировать иностранный ресурс, причем рассчитанный только на вьетнамцев )
storeCacheInfo: false — отключает )
> $cacheManager->remove('@sf_cache_partial?module=index&action=_listingBlock&sf_cache_key=*');

Лучше не использовать звездочки (*) при чистке кэша при условии использования memcache. Так как при удалении со звездочкой используется метод removePattern, который проходит по всем ключам из кэша и удаляет нужные по маске. Так вот хранятся эти все ключи там же в memcache в отдельной записи [prefix]_metadata c expire равной 0. Может случится ситуация, когда объем записи превысит лимит. ( у меня случилось к слову ) А дальше у сами додумайте ).

Отключить сохранение ключей в одну запись можно параметром:

storeCacheInfo: true

В версия symfony < 1.2.9 эти ключи добавлялись даже без удаления дубликатов:
protected function setCacheInfo($key)
 {
  $keys = $this->memcache->get($this->getOption('prefix').'_metadata');
  if (!is_array($keys))
  {
   $keys = array();
  }
  $keys[] = $this->getOption('prefix').$key;
  $this->memcache->set($this->getOption('prefix').'_metadata', $keys, 0);
 }


* This source code was highlighted with Source Code Highlighter.


Сейчас ситуация лучше, ключи удаляются:
protected function setCacheInfo($key, $delete = false)
 {
  $keys = $this->memcache->get($this->getOption('prefix').'_metadata');
  if (!is_array($keys))
  {
   $keys = array();
  }

  if ($delete)
  {
    if (($k = array_search($this->getOption('prefix').$key, $keys)) !== false)
    {
     unset($keys[$k]);
    }
  }
  else
  {
   if (!in_array($this->getOption('prefix').$key, $keys))
   {
    $keys[] = $this->getOption('prefix').$key;
   }
  }

  $this->memcache->set($this->getOption('prefix').'_metadata', $keys, 0);
 }


* This source code was highlighted with Source Code Highlighter.
В каждый партиал или компонент можно передавать с параметрами sf_cache_key. В этом случае ключ не генерируется, генерируете его вы сами.

Или вы можете переопределить обработчик генерации ключей. В settings.yml сразу после .settings определить параметр cache_namespace_callable.

Например
cache_namespace_callable: [«CacheGenerator», «generateCacheKey»]
«Cтранноприимный дом» Елены Челноковой
Книга сборник историй, рассказанных странными людьми. Людьми не похожими на остальных. Странными, колеками с точки зрения общества. Те кому понравился Коэлье, оценят и эту книгу.

Еще у этого автора понравился небольшая повесть «Страшный суд»

«Бизнес + Креатив. Преодолеть невидимые барьеры» Гогац, Мондехар
Я понял принцип о котором вы говорите. Обдумаю как его применить в узких местах проекта. Я думаю он не противоречит, а даже дополняет то, к чему я пришел. Спасибо.

p.s. Вот только не знаю в знак благодарности минусовать вас или плюсовать :)
слабовато разбираетесь в кэшировании

Знаете, эта фраза поставила меня в тупик. Объясню почему — цикл моих статей не о том, в чем я слабо разбираюсь или не разбираюсь. Они, если вы посмотрите еще раз повнимательнее — о том, как я разобрался с насущными задачами

Цель была поставлена при решении рабочей задачи, а спортивного вопроса — разбираюсь или нет — не стояло вообще.

Общие фразы вашего комментария отнюдь не свидетельствуют о том, что вы разбираетесь в этом больше…

Странно. Если разбираетесь — напишите как и в чем в отдельном посте. Понимаю, что клеить ярлык проще…

Предложите решение лучше — с удовольствием почитаю и приму на вооружение!
Написал не туда. Ответ.
Изначально было так и реализовано, только без наблюдателя. В самой модели писался метод cleanCache, который и отвечал за чистку кэша view.

Постараюсь объяснить на примере.
Возьмем к примеру пользователя. У нас есть модель его самого, модель аватарки, картинок, профайла и т.д. и 10 разных блоков с этими данными в разных комбинациях. Пользователь сменил пол и мне надо сбросить во всех 10 блоках кэш, сменил город — в 8, аватарку — 5 и т.д. Добавили еще блок, бежим по всем классам, меняем метод cleanCache. Дизайн поменялся, опять меняем методы чистки кэша. К тому же на сайте не только юзер ;)

Да можно сделать наблюдателя, попытать упростить все это дело. Но зачем?

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

а мы и не говорим о сильном выиграше. Просто приятно когда объем кэша уменьшается с 400 мб до 100Мб.

как могут добавить проблем сложные шаблоны — вполне представляю

Согласен. Но в Symfony пока нет шаблонизатора. Все пишется в php. Некоторые партиалы/компоненты конечно приходится кэшировать. Тем не менее сопровождать проект стало легче. Ведь основной причиной перехода на кэширование модели была простота валидации данных.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Registered
Activity