Спасибо большое, мы паралельно пришли к похожему решению. Странно что разработчики RoR ещё не сделали встроенную опцию для этого, неотключаемая фича есть баг. Думаю это можно смело добавить в FAQ nginx благо использование его для Ruby становится всё более популярным
On 6/4/07, TDz TDz <tdz@xxxxxxxxxxxx> wrote: > В RoR есть вроде спец опция отключающая его механизмы оптимизации работы с > мемкешд после чего он должен писать без выкрутасов. Дебагали след образом -
> мемкеш демон запущен с -vv чтоб видеть запросы и ответы, запросы давали > правда вместо telnet по nc вроде. В общем получается что nginx выдаёт > приблизительно то же что и nc, попробую ковырять API рубивское
Решение:
1. Скопировать memcache_util.rb в lib
2. добавить require RAILS_ROOT + '/lib/memcache_util.rb' в environment.rb до CACHE = MemCache.new
3. поправить memcache_util
def
self.get(key, expiry = 0, raw = false) start_time = Time.now value = CACHE.get key, raw elapsed = Time.now - start_time ActiveRecord::Base.logger.debug('MemCache Get (%0.6f) %s' % [elapsed, key])
if value.nil? and block_given? then value = yield put key, value, expiry end value rescue MemCache::MemCacheError => err ActiveRecord::Base.logger.debug "MemCache Error: #{
err.message}" if block_given? then value = yield put key, value, expiry end value end
## # Sets +value+ in the cache at +key+, with an optional +expiry+ time in
# seconds.
def self.put(key, value, expiry = 0, raw = false) start_time = Time.now CACHE.set key, value, expiry, raw elapsed = Time.now - start_time ActiveRecord::Base.logger.debug
('MemCache Set (%0.6f) %s' % [elapsed, key]) value rescue MemCache::MemCacheError => err ActiveRecord::Base.logger.debug "MemCache Error: #{err.message}" nil end
4. Теперь юзать для страниц Cache.get("Action:#{request.request_uri}", 0, true) и Cache.put("Action:#{request.request_uri}", response.body, 0, true)
Внимание на последний параметр. Для всего остального последний
параметр не передавать, оно false поставит.