PHP Connection_Aborted()仅在有时

我有文件下载PHP脚本。 该脚本可以下载最大4GB +的大文件。 实际上,用户往往会取消下载过程,或者在下载时closures浏览器窗口。

因此,当已经开始的下载过程将因任何原因而中止时,我必须注册。 最佳解决scheme看起来是通过connection_aborted()函数监视连接。

'connection_aborted()'似乎在下载取消或closures我的浏览器窗口时作出反应。 我的问题是,它不会以100%的精度反应。 它注册了约50%的取消下载或closures的浏览器。 如果没有检测到连接中止,则下载只需在服务器上继续,就好像浏览器不会取消它一样。

您是否请检查我的代码是否存在漏洞和错误? 我需要了解,是什么导致了这种行为:

// empty and turn off output buffering ob_flush(); flush(); // never expire this download script set_time_limit(0); fseek($fileObject, $seek_start); while(!feof($fileObject)) { //usleep(100000); //print(@fread($fileObject, $chunkSize)); echo(@fread($fileObject, $chunkSize)); // gradually output buffer to avoid memory problems by downloading large files ob_flush(); flush(); // check if the client was disconnected // important for cancelled or interrupted downloads if (Connection_Aborted()) { ChromePhp::log("Connection Aborted"); // sent to the database that the connection has been aborted $result = mysqli_query($dbc, "UPDATE current_downloads SET connection_aborted=TRUE WHERE user_id=1;"); // close the database connection mysqli_close($dbc); // close the open file @fclose($fileObject); exit(json_encode(array("result" => false, "error" => "Connection with the client was aborted."))); } $nLoopCounter++; $transferred += $chunkSize; $downloadPercentage = (($nLoopCounter * $chunkSize) / $fileSize) * 100; $result = mysqli_query($dbc, "UPDATE current_downloads SET progress_percent=$downloadPercentage, transferred=$transferred, connection_aborted=$strConnectionAborted, iteration=$nLoopCounter WHERE user_id=1;"); if($result == false) { // close the database connection mysqli_close($dbc); // close the file fclose($handle); // prepare output message $outputArray = array("result" => 0, "message" => "Error Processing Database Query"); // output the message echo json_encode($outputArray); exit; } } // file save was a success @fclose($fileObject); 

我使用以下内容:

  • Apache 2.4.4
  • PHP 5.4.12
  • MySQL 5.6.12
  • 谷歌浏览器版本32.0.1700.107米
  • Windows 7 x64

谢谢。

添加函数connection_status ,然后再试一次

 if(connection_status()!=0||connection_aborted()!=0||){ //your code }