thanks,

not so easy to use, as i can not use stdout anymore
but it works.


On Mon, Aug 25, 2014 at 10:57 AM, shimi <linux...@shimi.net> wrote:

> On Mon, Aug 25, 2014 at 10:25 AM, Erez D <erez0...@gmail.com> wrote:
>
>> hi
>>
>> i have a php cgi scripts that
>> 1. generates an http response , this takes less than a second
>> 2. do some stuff that may take some time, lets say a minute
>>
>> when posting to that cgi, although the html is returned in less then a
>> second, the request is not closed until the minute has passed.
>>
>> The request will end when PHP will tell its upstream that it has ended.
> After all, it may still produce output, which the client is supposed to
> receive.
>
>
>> i want the http transaction to be closed when done (i.e. less than a
>> minute)
>> but the php script to continue it's action (e.g. the minute it takes)
>>
>> can i do it in php ? i.e. flush, or send eof, which will finish the
>> request but leave the php running until done ?
>>
>>
> You could at the worst case execute the code from an external file with a
> system() and backgrounded (append & to the command), a solution that will
> always work (but is ugly).
>
> An alternative approach which was possible in the past was to use
> http://php.net/register-shutdown-function to handle the request 'cleanup'
> (which is what I assume you are trying to do) - but since PHP 4.1 this
> stuff is no longer possible because now this can also send output to the
> client. Assuming you have a newer PHP... which is highly likely... you
> could try this instead:
>
> <?php
> ob_end_clean();
> header("Connection: close");
> ignore_user_abort(); // optional
> ob_start();
> echo ('Text the user will see');
> $size = ob_get_length();
> header("Content-Length: $size");
> ob_end_flush(); // Strange behaviour, will not work
> flush();            // Unless both are called !
> // Do processing here
> sleep(30);
> echo('Text user will never see');
> ?>
>
> ( Shamelessly copied from http://php.net/connection-handling )
>
> The idea is to buffer all the response in memory, then measure the buffer
> size of the response, then tell that to the server/client, and also let the
> connection to not support keep-alive. Then throw everything to the client.
> Since the response is of a given size, and the server/client has got all of
> it, it has nothing to do further with the server, so it has no reason not
> to close the socket.
>
> HTH,
>
> -- Shimi
>
>
_______________________________________________
Linux-il mailing list
Linux-il@cs.huji.ac.il
http://mailman.cs.huji.ac.il/mailman/listinfo/linux-il

Reply via email to