ID:               41672
 Updated by:       [EMAIL PROTECTED]
 Reported By:      mfshop at comcast dot net
-Status:           Open
+Status:           Bogus
 Bug Type:         Unknown/Other Function
 Operating System: Windows 2003 Server
 PHP Version:      4CVS-2007-06-12 (snap)
 New Comment:

connection_aborted() & connection_status() rely on write operation,
which SHOULD fail if the request was cancelled.
Unfortunately, it depends on your web-server. so it may or may not work
depending on its behaviour.


Previous Comments:
------------------------------------------------------------------------

[2007-06-12 23:01:36] mfshop at comcast dot net

More information:
Even though output buffer isn't on, including an ob_flush(); before the
flush(); starts to send the data to the browser right away.  If the loop
is long enough, approximately 30-40 seconds after hitting the stop
button it will finally return 1 for connection_status and
connection_abort (and setting ignore_user_abort(false) also seems to
work at that point).  This only happens when doing BOTH ob_flush() AND
flush().  Using flush() by itself, it takes considerably longer but
eventually works (though it takes around 60-70 seconds, which may
explain the behavior in my previous comment).

I am curious about the behavior of the ob_flush(); speeding things up
(output buffering isn't on...).  In any case, it still seems like a long
time to wait before detecting a closed/aborted connection.

------------------------------------------------------------------------

[2007-06-12 20:24:05] mfshop at comcast dot net

As a quick addendum.  If I set the loop size in the above example code
to 60 then the results are the same except that the final line reads as
I would expact: "Final: 1, 1".  Note that this seems to be related to
time and not the amount of data sent as keeping the loop count at 20 but
attempting to echo out a lot more text to the browser repeats the
original results.  This seems to indicate that connection_status() and
connection_aborted() at least return the proper values when called
within a registered shutdown function AND enough time has passed. 
However, the functions still return 0 outside of the shutdown function
and setting ignore_user_abort() one way or another has no effect.  In
other words, the functions still can't be used to detect a browser abort
and stop execution of the script at that point (after performing any
required cleanup in the registered shutdown function).

------------------------------------------------------------------------

[2007-06-12 19:58:42] mfshop at comcast dot net

Description:
------------
Running IIS6 on Windows 2003 Server and the latest PHP 4.4.8-dev from
snaps.php.net.  The problem also exists on PHP 4.4.7.  Running as an
ISAPI module.

connection_status() and connection_abort() always return 0.  Setting
ignore_user_abort(true) or ignore_user_abort(false) also seems to have
no effect.  In the example script below, changing
ignore_user_abort(true) to ignore_user_abort(false) produces the exact
same results.

This seems to be similar or the same as Bug #30301 but for a PHP 4
instead (also that bug report seems to have been ignored/closed due to
no feedback status).

Reproduce code:
---------------
function script_end()
{
        global $fd;
        $clientstate = connection_aborted();
        $clientstate2 = connection_status();
        fwrite($fd, "Final: $clientstate, $clientstate2\n");
        fclose($fd);
        exit();
}

$fd=fopen("test.txt", "w"); // Change filename/dir to somewhere where
the IIS User has proper permissions as necessary.
register_shutdown_function("script_end");
ignore_user_abort(true);
for ($i=0; $i<20; $i++)  {
        echo "$i<br>\n";
        Flush();
        $clientstate = connection_aborted();
        $clientstate2 = connection_status();
        fwrite($fd, "$i: $clientstate, $clientstate2\n");
        sleep(1);
}

Expected result:
----------------
Start loading the page and then hit the stop button before it finishes.
 Look at the test.txt afterwards.  We expect to see the values returned
by connection_aborted() and connection_status() to change/be something
other than 0 or, depending on how ignore_user_abort() is set, we may
expect to see the count not reach 20 (i.e. the script detecting user
abort and terminating the script).

Actual result:
--------------
The test.txt file will always end up looking like so:

0: 0, 0
1: 0, 0
2: 0, 0
3: 0, 0
4: 0, 0
5: 0, 0
6: 0, 0
7: 0, 0
8: 0, 0
9: 0, 0
10: 0, 0
11: 0, 0
12: 0, 0
13: 0, 0
14: 0, 0
15: 0, 0
16: 0, 0
17: 0, 0
18: 0, 0
19: 0, 0
Final: 0, 0



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=41672&edit=1

Reply via email to