4

Rails 3.1.1 と Herkou の使用

アプリに 1,000 個の製品があります。それらはすべて、フラグメントキャッシングによって効果的に解決される非常に遅いコントローラーを持っています。データは頻繁に変更されるわけではありませんが、定期的に (私の場合は週に 1 回) 有効期限が切れる必要があります (これはスイープによって行います)。

さて、キャッシュされたビューを一掃した後、ユーザーが製品に次々とアクセスしようとして新しいフラグメントを作成しないようにします (最初の読み込みで約 6 ~ 8 秒、キャッシュされた読み込みで 2 ~ 3 秒かかります)。各製品ページを 1 つずつロードし、サーバーにそれらのフラグメントを作成させる何らかのスクリプトを使用して、これを実行できると思います。

これは次の 3 つの方法で処理できると想像できます。

  1. ある種の get-command を使用して各 URL にアクセスしようとするスクリプトをローカル マシンで実行します。

  2. 各製品をロードするスイーパーの後に、サーバー上で同じタイプのスクリプトを実行します。その場合、どうすればいいですか?

  3. スマート Rails コマンドを使用して、これを自動的に行います。これほどエレガントなコマンドはありますか?

4

2 に答える 2

0

ページを実行してカールする rake タスク、またはできればワーカーとして実行するスクリプトを作成します。curl を呼び出すだけの場合は、gem を含める必要はありません。

`curl -A "CacheRefresher" #{ENV['HOSTNAME']}/api/v1/#{klass.name.underscore.pluralize}/#{id} >/dev/null 2>&1` 
于 2015-04-10T19:28:26.623 に答える
0

このスクリプトを作成しましたが、動作します。「product.slug」は、 Friendly_id がインストールされているためです。www.mydomain.com/productabc-123/ などの名前で URL 変数を生成し、Nokogiri によって読み取られます (このソリューションには Nokogiri gem が必要です)。

このソリューションでは、フラグメント キャッシングからアクション キャッシングに切り替えたことに注意してください (フラグメント キャッシングを使用しているという質問とは対照的に)。これの重要な違いは、キャッシュをチェックするときですif Rails.cache.exist?('views/www.mydomain.com/' + product.slug)。fragment_caching の場合は、代わりにフラグメント名にする必要があります。

require 'nokogiri'
require 'open-uri'

Product.all.each do |product|
  url = 'http://www.mydomain.com/' + product.slug  
  begin      
    if Rails.cache.exist?('views/www.mydomain.com/' + product.slug)     
      puts url + " is already in cache"
    else
      doc = Nokogiri::HTML(open(url))
      puts "Reads " + url
# Verifies if the caching worked. Only for trouble shooting
      if Rails.cache.exist?('views/www.mydomain.com/' + product.slug)     
        puts "--->" + url + " is NOW in the cache"
      else
        puts "--->" + url + " is still not in the cache!"
      end
      sleep 1
    end
  rescue
    puts 'Normal rescue of ' + url
  rescue Timeout::Error
    puts 'Timeout rescue of ' + url
    puts 'Sleep for 5 sec'
    sleep 5
    retry
  end
end
于 2012-10-30T05:52:32.303 に答える