dismiss Step into the future! Click here to switch to the beta php.net site
downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | conferences | my php.net

search for in the

connection_status> <Misc. Functions
[edit] Last updated: Fri, 28 Jun 2013

view this page in

connection_aborted

(PHP 4, PHP 5)

connection_abortedCheck whether client disconnected

Description

int connection_aborted ( void )

Checks whether the client disconnected.

Return Values

Returns 1 if client disconnected, 0 otherwise.

See Also



connection_status> <Misc. Functions
[edit] Last updated: Fri, 28 Jun 2013
 
add a note add a note User Contributed Notes connection_aborted - [6 notes]
up
4
nathanb at php dot net
5 months ago
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();
?>
up
0
phpcoder at cyberpimp dot techlab dot info
6 years ago
Although the documentation indicates it returns an int, I found comparing the return value with numeric values does not seem to work.

Example (does not work):
<?php
if (connection_aborted()==1) {
fwrite($filehandle, 'aborted!');
}
?>

You're better off just assuming it returns boolean

Example (does work):
<?php
if (connection_aborted()) {
fwrite($filehandle, 'aborted!');
}
?>
up
-1
Luciano
3 years ago
In order to detect a disconnection inside the script we need to flush the buffer (it is only when the the server tries to send the buffer content that it will see that the connection is broken).

Thus we need to use the ob_implicit_flush() function to flush automatically the buffer

This is an example of a disconnection detection :

<?php
 
// enables the automatic flush
 
ob_implicit_flush();

  function
verifyCommunication() {
   
$status = (connection_aborted()?"not ":"") ."sent";
   
persistCommunication(new Communication($status));
  }

 
// we will check the communication state when the script finished
 
register_shutdown_function(verifyCommunication);
  echo
"blabla";
 
// this sleep is used to have time to break the connection on the client side
 
sleep(10);
  echo
"tata";
?>

I use such a process to cancel a request if the client didn't get the acknowledgement because he will redo his request...
up
-2
rickyale at ig dot com dot br
10 years ago
I know why nobody can use the functions connection_XXX(). If the php code do not send anything to buffer, the php dont check the connection, so, the connection_timeout will still NORMAL and will not be ABORTED.

Ex

<?php
Set_Time_Limit
(0);  //this you know what gonna do
Ignore_User_Abort(True); //this will force the script running at the end

While(!Connection_Aborted()) {
   Echo
"\n"; //this will save de while
  
Flush(); //Now php will check de connection
   
While(CONDITION) {
        Echo
"My chat....";
    }
 
Sleep(1);
}
?>

end
up
-3
rickyale at ig dot com dot br
3 years ago
(connection_aborted not working)
I had this problem years ago, now the problem came back after upgrading php... i tried everything i found and in the end the function ob_end_flush();  on top of script as post in php bug track solved the problem. Im using windows 7 x64 / php 5.2.4 / apache 2.2.14 (win32)

try adding ob_end_flush(); on top of you script.
i read something about this but can't remember where, it was related to a bug or something.

hope this help.
up
-2
djdark88 dot 7 at gmail dot com
2 years ago
Hmm i went and did the same thing for a realtime application i got some more bugs..

<?php
// Signin Script
while(!connection_aborted())
{

while(!
$result and !connection_aborted())
 {
    
// FETCH RESULT VIA SQL
   
if(SQL DUMPS SOMETHING)
        {
$result =true;
        }
 }

// SEND RESULT

echo "<br>" ; // To make this work on chrome
flush();obflush(); // FLUSH (in flush u will need to add a <br> with the flushed data in order to get the response sent to user if the user is using chrome )

}

//Signout Script
?>

even in my script it sometimes does NOT sent the result!!!

 
show source | credits | stats | sitemap | contact | advertising | mirror sites