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

Reply via email to