Ruby Sinatra::具有机架非分块响应的流式传输
我在尝试使用Sinatra和Rack进行这个简单的流式测试时遇到了困难 在我的stream.rb文件中,我有:Ruby Sinatra::具有机架非分块响应的流式传输,ruby,sinatra,rack,Ruby,Sinatra,Rack,我在尝试使用Sinatra和Rack进行这个简单的流式测试时遇到了困难 在我的stream.rb文件中,我有: require 'sinatra' require 'sinatra/streaming' class StreamAPI < Sinatra::Base helpers Sinatra::Streaming get '/stream' do stream do |out| 5.times do
require 'sinatra'
require 'sinatra/streaming'
class StreamAPI < Sinatra::Base
helpers Sinatra::Streaming
get '/stream' do
stream do |out|
5.times do
out.puts "Hello!"
sleep 1
end
out.flush
end
end
run! if app_file == $0
end
当我卷曲url时,我得到“Hello!”5次,但在5秒钟后全部一次。查看标题,我可以看到传输编码
设置为分块
。我想要的是一声“你好!”在停顿1秒后再次出现
编辑:除了下面选择的答案,我还需要添加
proxy\u buffering off代码>到我的NGINX配置文件。这取决于您使用的服务器。从:
请注意,流行为,特别是并发请求的数量,在很大程度上取决于用于服务应用程序的web服务器。有些服务器,比如WEBRick,甚至可能根本不支持流媒体。如果服务器不支持流,则在传递给流的块完成执行后,将立即发送正文
看起来您使用的服务器不支持流式传输。如果您切换到一个可以(例如或)的流媒体,这应该会起作用。对流媒体不太熟悉,但您的代码要求它每隔一秒而不是每5秒放置一次“Hello!”
对不起,我尝试了很多不同的值,并在此处放置了错误的值。因此,如果我安装了thin,请使用set:server,“thin”
它应该使用thin而不是webrick,这应该可以解决我的问题?@ecnepsnai是的,应该可以。事实上,您可能不需要添加set:server,:thin
,因为它会被自动检测到,但是如果您依赖它,则包含它会更安全。@ecnepsnai如果您使用rackup
则set:server,:thin
将无法工作(它只影响Sinatra内置服务器),在这种情况下,您需要使用rackup-s thin
(尽管rackup
可能会自动检测到thin(如果安装了)。您还可以将\s thin
添加到config.ru
中,这将产生相同的效果。因此,我现在正在使用thin,但它仍然不能像我预期的那样工作。我仍然有同样的问题。除了现在,即使没有sleep
命令,响应也只需要1分钟。
require 'rack'
require './stream.rb'
run StreamAPI