1

Rakefile からスケジュールされたタスクで更新したい Sinatra アプリケーションにグローバル変数があります。アプリケーションは Heroku でホストされていることに注意してください。この変数にアクセスするためにヘルパーを設定しました。

get '/' do
    @@var
end

helpers do
    def get_var
        return @@var
    end

    def set_var(value)
        @@var = value
    end
end

私のRakefileのタスクは次のとおりです。

task :do_something do
    Sinatra::Application.set_var(get_data)
end

def get_data
    # Retrieve value from external source
    ...
    return val
end

私が遭遇した問題は、タスクが適切に実行されることですが、Sinatra アプリケーションの変数が更新されないことです。これはSinatra::Application、Rakefile 内から呼び出すと、更新しようとしているプラ​​イマリ インスタンスとは別のアプリケーション インスタンスが実際に作成されるためだと思います。

Rakefile タスク内から実行中の Sinatra Web アプリのスコープにアクセスする方法があるかどうかを知りたいです。

*注意: スケジュールされたタスクで取得した値をデータベースに書き込んで、Sinatra アプリからアクセスすることもできますが、この変数は更新頻度が低いのに定期的に取得されるため、データベースに保持したいのでやり過ぎです。簡単にアクセスできるメモリ。データベースへの移行を避けるために Memcache と Redis を調べましたが、これも単一の値では過剰であると感じています。これに同意しないでください。

編集: Alexey Sukhoviy のコメントに関して、Heroku は tmp ディレクトリ外のファイルへの書き込みを許可しておらず、これらはアプリケーションのニーズを満たすのに十分な時間保持されていません。

4

1 に答える 1

2

Memcacheを使用して変数を保存することになりました。Heroku では無料のアドオンが提供されているため、これは Heroku とうまく連携します。Dalli gemは、Memcache 用の Ruby との単純なインターフェースを提供します。Sinatra アプリ ファイルで、次のオプションを設定します。

require 'dalli'

set :cache, Dalli::Client.new

次に、格納された変数を Rakefile から復元できます。

task :do_something do
    Sinatra::Application.settings.cache.set('var', get_data)
end

その後、Sinatra コントローラーでこの変数に再度アクセスできます。

settings.cache.get('var')
于 2012-11-12T23:27:07.837 に答える