Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何检测rails应用程序是否在Unicorn下运行?_Ruby On Rails_Unicorn - Fatal编程技术网

Ruby on rails 如何检测rails应用程序是否在Unicorn下运行?

Ruby on rails 如何检测rails应用程序是否在Unicorn下运行?,ruby-on-rails,unicorn,Ruby On Rails,Unicorn,我需要在Rails应用程序中设置与外部服务的连接。我在初始化器中这样做。问题是服务库使用线程传递(我需要线程传递,因为我不能让它陷入请求的困境),但Unicorn生命周期会导致线程被终止,工作人员永远看不到它。一种解决方案是在每个请求上调用一个新连接,但这是不必要的浪费 最佳解决方案是在unicorn配置中的after_fork块中设置连接。存在的问题是,无法在unicorn之外调用,这意味着我们无法在开发/测试环境中测试它 所以问题是,确定Rails应用程序是否在Unicorn(主进程或工作进

我需要在Rails应用程序中设置与外部服务的连接。我在初始化器中这样做。问题是服务库使用线程传递(我需要线程传递,因为我不能让它陷入请求的困境),但Unicorn生命周期会导致线程被终止,工作人员永远看不到它。一种解决方案是在每个请求上调用一个新连接,但这是不必要的浪费

最佳解决方案是在unicorn配置中的after_fork块中设置连接。存在的问题是,无法在unicorn之外调用,这意味着我们无法在开发/测试环境中测试它


所以问题是,确定Rails应用程序是否在Unicorn(主进程或工作进程)下运行的最佳方法是什么?

您可以检查Unicorn模块是否已使用
对象.constants.include?('Unicorn')
定义


当然,这是独角兽特有的。一种更通用的方法是使用一种方法来建立您的连接并记住它已经这样做了。如果它被多次调用,它只会在后续调用中返回“不做任何事情”。然后在应用程序控制器的after_fork和before_过滤器中调用该方法。如果它是在after_fork中运行的,那么它在before_筛选器中不会执行任何操作;如果它还没有运行,那么它会在第一个请求中执行它的操作,在后续请求中则不会执行任何操作。

有一个环境变量可以在Rails中访问(我知道它存在于3.0和3.1中),请检查
env['SERVER_SOFTWARE']
的值。您可以将正则表达式或字符串与该值进行比较,以确定您在哪个服务器下运行

我的管理员中有一个模板,它遍历env变量并输出其内容

独角兽4.0.1

env['SERVER_SOFTWARE'] => "Unicorn 4.0.1"
rails服务器(webrick)


您可以检查
defined?(Unicorn)
并在gem文件集中:
gem:Unicorn,require:false
事实上,您不需要在rails应用程序中加载Unicorn库。
服务器由shell中的
unicorn
命令启动
config/unicorn.rb
将环境变量定义为


环境['RAILS\u STDOUT\u LOG']='1'
工人联合会进程3
超时90

然后这个变量
ENV['RAILS\u STDOUT\u LOG']
将可以在RAILS应用程序工作线程中的任何位置访问

我的问题:
我想在Unicorn workers上输出所有日志(SQL查询),而不是在Heroku上的任何其他Worker上,因此我所做的是在Unicorn配置文件中添加env变量,检查Unicorn常量似乎是一个很好的解决方案,但是这在很大程度上取决于
Gemfile
中是否提供了
require:false
。如果不是(这很可能),检查可能会给出假阳性

我以一种非常直接的方式解决了这个问题:

# `config/unicorn.rb` (or alike):
ENV["UNICORN"] = 1

...

# `config/environments/development.rb` (or alike):
...
# Log to stdout if Web server is Unicorn.
if ENV["UNICORN"].to_i > 0
  config.logger = Logger.new(STDOUT)
end
干杯

# `config/unicorn.rb` (or alike):
ENV["UNICORN"] = 1

...

# `config/environments/development.rb` (or alike):
...
# Log to stdout if Web server is Unicorn.
if ENV["UNICORN"].to_i > 0
  config.logger = Logger.new(STDOUT)
end