you can re-open stdout and point it to a file (perhaps even to /dev/null).
On 08/25/2014 11:41 AM, Erez D wrote:
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 <[email protected] <mailto:[email protected]>> wrote: On Mon, Aug 25, 2014 at 10:25 AM, Erez D <[email protected] <mailto:[email protected]>> 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 [email protected] http://mailman.cs.huji.ac.il/mailman/listinfo/linux-il
_______________________________________________ Linux-il mailing list [email protected] http://mailman.cs.huji.ac.il/mailman/listinfo/linux-il
