我在Sinatra应用程序中有一个全局变量,我想用我的Rakefile中的计划任务进行更新。请注意,该应用程序托管在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应用程序中的变量永远不会更新。我假设这是因为从Rakefile中调用Sinatra::Application
实际上是从我想要更新的主实例创建一个单独的应用程序实例。
我想知道它们是否是一种从Rakefile任务中访问正在运行的Sinatra Web应用程序范围的方法。
*注意:我可以将计划任务中检索到的值写入数据库,然后从Sinatra应用程序访问它,但这样做会有些过分,因为这个变量不经常更新但是经常检索,我宁愿将其保存在内存中以便于访问。我已经调查了Memcache和Redis以避免转向数据库,但我再次认为这对于单个值来说是过分的。随意不同意这一点。
编辑:关于Alexey Sukhoviy的评论,Heroku不允许写入tmp目录之外的文件,并且这些文件不能保持足够长的时间以满足应用程序的需要。
答案 0 :(得分:2)
我最终使用Memcache存储变量。 Heroku可以很好地使用它,因为它们为它提供了免费的附加功能。 Dalli gem为Ruby for Memcache提供了一个简单的接口。在我的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')