Displaying output of command line over HTTP in real time

Joel Bernstein joel at fysh.org
Mon Dec 19 13:52:50 GMT 2005


On Mon, Dec 19, 2005 at 01:08:39PM +0000, James Davis wrote:
> I've got a command line program that I wish to launch from a mod_perl
> script. The program can take it's time to execute and the partial output
> is useful so I'd like to be able to display the output piped through
> HTTP as and when it becomes available. I'm sure I've seen this done
> before :-)
> 
> What's the magic I need?

You have two options:

1) Keep the HTTP connection open, and keep writing new data into it. 
2) Update the browser with a new page regularly.

Unless you need serious interactivity I'd suggest reading into a buffer,
and flushing that buffer into your response every 1s or so. There may be
a better/more modern way but I would use an NPH [non-parsed headers]
script so that you can instruct the browser to expect refreshing
content. Each time you have new content to send, you separate it from
the previous set of content with a pre-determined boundary string, then
send a new set of HTTP headers and content.

At the top of your perl program, add:
  local $| = 1;

And to your apache configuration for that Location, add:
  PerlSendHeader Off

Then you can send your own HTTP headers, eg using CGI.pm:

 use CGI qw(:standard);
 my $BOUNDARY = "ARandomStringWhichWontOccurInYourContent";
 print header(
 	-nph     => 1,
 	-pragma  => "no-cache",
        -expires => '+0d',
        -type    => "multipart/x-mixed-replace;boundary=$BOUNDARY",
 );

And then, when your buffer is full enough, send the content followed by
"\n--$BOUNDARY\n".

Does that give you enough information to work from?

/joel


More information about the london.pm mailing list