Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

cgi buffering

by Caesura (Sexton)
on Sep 30, 2009 at 15:38 UTC ( #798364=perlquestion: print w/replies, xml ) Need Help??
Caesura has asked for the wisdom of the Perl Monks concerning the following question:

Hello again,

I have an odd problem, related to the "server push" one I had earlier.

I have an apache 2 webserver with two cgi-bin/ directories, both configured the same (as far as I can see in conf/httpd.conf).

There is the same Perl CGI program in each of them, printing out HTML on the fly to a Firefox 3 web browser in two tabs.

One of them prints the HTML out as it goes, the other waits for the webpage to finish before printing. This is my test code in each of the cgi-bin/ directories :
#!/usr/bin/perl # $Header$ use strict; use CGI qw(:standard); # No buffering of output to browser. # $|++; print header; print qq { <HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=wind +ows-1252"> <META NAME="Generator" CONTENT="vi"> <TITLE>the Title</TITLE> </HEAD> <BODY> }; print "Starting ...<br>\n"; for (my $i=0; $i < 10; $i++) { print "$i<br>\n"; sleep 1; } print "</BODY></HTML>"; exit;
In one tab the text is printed as it goes, the other it waits.

Is there anyone who can tell me where to look for any Perl/Apache config changes between the two cgi-bin/ directories? It all seems most odd to me! I don't think we use mod_perl, so that's not the thing. Printing @INC and perl -V in each of the cgi-bin progs yeilds the same results.

One thing - one of the cgi-bin dirs has an .htaccess file in the dir above cgi-bin, and the other doesn't. Would this affect the buffering behaviour?
AuthUserFile /the_root/dir_one/security/security.pwd AuthGroupFile /dev/null AuthName EnterPassword Authtype Basic require valid-user
Any pointers would be useful, I'm sure its obvious, but I can't put my finger on why these things are different, running the same perl file.

Thanks in advance!

Caesura

Replies are listed 'Best First'.
Re: cgi buffering
by ccn (Vicar) on Sep 30, 2009 at 15:45 UTC
    Apache has own buffer. You can send spaces as workaround
    print "Starting ...<br>\n"; for (my $i=0; $i < 10; $i++) { print $i, (' ' x 1024) , "<br>\n"; sleep 1; }

      Switch to non-parsed-headers mode (i.e. rename your CGI to nph-*) and generate the HTTP response yourself. Apache won't buffer your response in that case.

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
        Hi Alexander, thanks for that. I tried renaming my script to nph-bob.pl :
        #!/usr/bin/perl -w use strict; use CGI qw(:standard -nph); $| = 1; print header; print qq { <HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=wind +ows-1252"> <TITLE>the Title</TITLE> </HEAD> <BODY> }; print "Starting ...<br>\n"; for (my $i=0; $i < 10; $i++) { print "$i<br>\n"; sleep 1; } print "</BODY></HTML>"; exit;


        No effect at all, one cgi-bin env is fine, the other waits for the page to complete before displaying it. I notice from the Apache 2 documentation that it no longer buffers like pre 1.3 did, and that there is no need for nph- prefixed scripts (I think it meant that).

        I even tried using "Multipart/mixed" to no avail either. Anyone have any other ideas?

        Thanks much,

        Caesura

        Update : Its actually Server version: Oracle HTTP Server Powered by Apache/1.3.19 (Unix), sorry ;)
      Hmmm, thanks for that, but it didn't make any difference to the non-working cgi-bin/ environment. Even with 2048 spaces ;)

      I wonder if there's an option in Apache or the Perl env to stop buffering, that's been set in one env and not the other ...?

      Caesura
        I forgot how big that buffer. Please try 4096 also.
Re: cgi buffering
by Anonymous Monk on Sep 30, 2009 at 15:41 UTC
    That is not server push. You need to look at the CGI rfc and send the appropriate headers
      Are there specific headers to do with buffering? I tried :
      print header (-expires => 'now');
      to no avail. The thing is - it works on one cgi-bin directory (or environment I should say), and not on the other. Odd.
        The thing is - it works on one cgi-bin directory (or environment I should say), and not on the other. Odd

        Compare the %ENViroments for the two, and the headers.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://798364]
Approved by rovf
help
Chatterbox?
[ambrus]: I really don't like automagic stuff. I'm happy when computers do exactly what I tell them, even if that means they sometimes do the wrong thing.
[ambrus]: And I don't much like syntax highlighters. If you need a syntax highlighter to understand your code, then your code is written unclear.
[ambrus]: And if you need a syntax highlighter to color parenthesis green and numbers black and letters blue, then you're using the wrong font.
[ambrus]: I have to tolerate syntax highlighters when other people use them, but I don't use them myself. And sorry for the rant.
[GotToBTru]: I appreciate the ability to highlight matching brackets/ parentheses/ braces, both for my own code and the inconsistently indented code of others
[Corion]: I like editors that automatically highlight the matching parenthesis (like % in vi), but that's roughly the extent to which I like editor support ;)

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (12)
As of 2017-02-27 12:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?






    Results (385 votes). Check out past polls.