[Catalyst] $c->write() buffering?
Daniel J. Luke
dluke at geeklair.net
Thu Oct 31 21:21:07 GMT 2013
I replicated this today outside of Catalyst (just a small FCGI/FCGI::ProcManager test script). If anyone else has seen this/fixed it, I'd appreciate a pointer. I'll report back to the list if/when I get it resolved so that there's an answer in the list archives for future people to google otherwise.
On Oct 31, 2013, at 10:12 AM, Daniel J. Luke <dluke at geeklair.net> wrote:
> We're actually running Catalyst::Runtime 5.80031 (currently), so I believe it's using Catalyst::Engine::FastCGI which just does *STDOUT->syswrite()
>
> I guess I try to do some testing with newer Catalyst (and maybe alternate deployment methods), to see if that changes anything. Looking through the Changelog, I didn't see anything specifically related to this, though (although I imagine the Plack stuff makes it somewhat different in the more recent releases).
>
> On Oct 30, 2013, at 11:03 PM, Hailin Hu <i at h2l.name> wrote:
>> It is an engine relevant stuff.
>> Find which engine you are using ( for example, Plack::Handler::FCGI )
>> and look around codes around write(r), you may find something.
>> Good luck :)
>>
>> On Wed, Oct 30, 2013 at 9:51 AM, Daniel J. Luke <dluke at geeklair.net> wrote:
>>> I've got some legacy CGI code that does a bunch of processing and uses the old hack of $| = 1; print "foo\n"; do_work(); print "foo done\n"; etc. (solution #1 from http://wiki.catalystframework.org/wiki/longcomputations)
>>>
>>> While I'll eventually convert it to a job queue, I'd like to create an output-identical implementation first with Catalyst, however it seems like I'm getting output buffering when I don't want it.
>>>
>>> As a very simple test, I've set up apache 2.2, mod_fastcgi (FastCgiExternalServer with -flush and without -flush) and a method like this:
>>>
>>> sub test: Local {
>>> my ($self, $c) = @_;
>>>
>>> $c->res->body('');
>>> $c->response->content_type( 'text/plain; charset=utf-8' );
>>> $c->finalize_headers;
>>>
>>> my $i;
>>> for($i=1;$i<8;$i++) {
>>> $c->write("$i: foo bar baz\n");
>>> sleep(1);
>>> }
>>> }
>>>
>>> I see all the data at once in my browser instead of a line every second, and with tcpdump, can see that all of the data is coming back in one packet and not in 8+ smaller packets like I expect. If I make the string that gets passed to write longer, I get several packets, but all at once (and not with each iteration through the for loop).
>>>
>>> Am I missing something obvious? Is there some way to get the behavior I'm expecting?
--
Daniel J. Luke
+========================================================+
| *---------------- dluke at geeklair.net ----------------* |
| *-------------- http://www.geeklair.net -------------* |
+========================================================+
| Opinions expressed are mine and do not necessarily |
| reflect the opinions of my employer. |
+========================================================+
More information about the Catalyst
mailing list