note 111167 added to function.connection-aborted
| From: | nathanb@php.net | Date: | Mon, 21 Jan 2013 20:50:13 +0000 |
| Subject: | note 111167 added to function.connection-aborted | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-193305@lists.php.net to get a copy of this message | ||
A trick to detecting if a connection is closed without having to send data that will otherwise
corrupt the stream of data (like a binary file) you can use a combination of chunking the data on
HTTP/1.1 by sending a "0" ("zero") as a leading chunk size without anything
else.
*NOTE* it's important to note that it's not a good idea to check the stream more then once
every few seconds. By doing this you are potentially increasing the data sent to the user with no
gain to the user.
A good reason to do it this way is if you are generating a report that takes a long time to run and
takes a lot of server resources. This would allow the server to detect if a user canceled the
download and do any cleanup without corrupting the file file being download.
Here is an example:
<?php
ignore_user_abort(true);
header('Transfer-Encoding:chunked');
ob_flush();
flush();
$start = microtime(true);
$i = 0;
// Use this function to echo anything to the browser.
function vPrint($data){
if(strlen($data))
echo dechex(strlen($data)), "\r\n", $data, "\r\n";
ob_flush();
flush();
}
// You MUST execute this function after you are done streaming information to the browser.
function endPacket(){
echo "0\r\n\r\n";
ob_flush();
flush();
}
do{
echo "0";
ob_flush();
flush();
if(connection_aborted()){
// This happens when connection is closed
file_put_contents('/tmp/test.tmp', sprintf("Conn Closed\nTime spent with connection
open: %01.5f sec\nLoop itterations: %s\n\n", microtime(true) - $start, $i), FILE_APPEND);
endPacket();
exit;
}
usleep(50000);
vPrint("I get echo'ed every itteration (every .5 second)<br />\n");
}while($i++ < 200);
endPacket();
?>
----
Server IP: 69.147.83.199
Probable Submitter: 173.167.160.145
----
Manual Page -- http://php.net/manual/en/function.connection-aborted.php
Edit -- https://master.php.net/note/edit/111167
Del: integrated -- https://master.php.net/note/delete/111167/integrated
Del: useless -- https://master.php.net/note/delete/111167/useless
Del: bad code -- https://master.php.net/note/delete/111167/bad+code
Del: spam -- https://master.php.net/note/delete/111167/spam
Del: non-english -- https://master.php.net/note/delete/111167/non-english
Del: in docs -- https://master.php.net/note/delete/111167/in+docs
Del: other reasons-- https://master.php.net/note/delete/111167
Reject -- https://master.php.net/note/reject/111167
Search -- https://master.php.net/manage/user-notes.php