У меня есть файл для загрузки PHP-скрипта. Сценарий может загружать большие файлы до 4 ГБ +. В действительности часто случается, что пользователи будут отменять процесс загрузки или закрыть окно браузера во время загрузки.
Поэтому я должен зарегистрироваться, когда уже начатый процесс загрузки будет по какой-либо причине прерван. Оптимальным решением для этого является контроль соединения через функцию connection_aborted () .
'connection_aborted ()', похоже, реагирует на отмену загрузки или закрытие окна моего браузера. Моя проблема заключается в том, что она не реагирует со 100% точностью. Он регистрирует около 50% отмененных загрузок или закрытых браузеров. Если прерывание соединения не обнаружено, загрузка просто продолжается на сервере, как если бы браузер не отменил его.
Не могли бы вы просмотреть мой код для уязвимостей и ошибок? Мне нужно понять, что вызывает поведение:
// 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);
Я использую следующее:
Спасибо.
Добавьте функцию connection_status
, а затем повторите попытку
if(connection_status()!=0||connection_aborted()!=0||){ //your code }