*Rails Output Streaming*
I am revisiting this again because I am in a situation where I need output streaming. Rails has two methods that utilize streaming (send_data, send_file) I've modified this to meet my needs, along with the help of people on the mailinglist. However the code below which should work, does not provide output streaming. I know in the past output streaming has worked within rails, I am wondering if in a current release it has been broken. Whatever the case is, I need to determine why I cannot get the output streaming mechanism in rails to work.
I'm using lighttpd on fc5. I've used mongrel with the same results.
class TestController < ApplicationController
def index
render :text => Proc.new { |resp, out|
out.puts 'start'
out.flush
10.times do
out.puts '.'
out.flush
sleep 1
end
out.puts 'done'
}
end
end
People succeed in answering Don Miguel de los Platanos's questions 42% of the time (8 successes in 19 attempts).
Answers by: Rich Collins | Zachary Holt
Sorry for the long post. I think you're not hitting some minimum buffer length with just a dot.
The following is streaming for me, and yours is not.
render( :content_type => 'text/html', :text => Proc.new { |response, output|
output.write( 'start' )
10.times do
output.flush
output.write(
" #{Time.now.to_s}
<!--DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF <br />DSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFFDSFFFFFFFFFFFFFFFFFF -->
" )
sleep 1
end
output.write 'done'
} )
I was real happy when I got this response hoping it was it, but sadly its not. I thought about what you said about minimum buffer size and initially it clicked and I remember of the 4k that it buffers at a time. However when you issue the flush method, it should push whatevers in that buffer regardless of the size. Perhaps the issue is related to my setup and not Rails neccessarily. At this point any guess is as good as mine.
However when you issue the flush
method, it should push whatevers in
that buffer regardless of the size.
Not necessarily. Which web server are you using?
lighttpd
Problem is with lighty, it doesn't support output streaming. Zach, can you tell me what server setup you use so I may emulate to implement my streaming.
I use lighty, and the above is working for me in Safari. Which browser are you using? Some won't display data as they get it.
Im using firefox on linux. I've tried lynx and curl and still no streaming. I just now got off lighty and am using fcgid with apache and still no streaming. Another thing is I've asked 3 people to run that code example and all of them cannot get a stream. I know firefox streaming works because we have applications in java using output streaming and work fine in firefox.
Well, I'm sorry to say that I've officially reached my limit on what I can do for you for $10. However, I'm a Rails consultant, and if you'd like to hire me, please get my email address through the "Ruby on Rails: Talk" Google group. You can search that group for "Zachary Holt."
Thanks.
Thanks for all the help Zachary, I just might end up taking you up on the offer. In the meantime, I've doubled the reward, its not much but its something.