jquery — PHP отвечает на ajax при запуске длинного скрипта

Я задал вопрос в Вот тот ответил и работает нормально,

но моя проблема в том, что когда скрипт работает более 4 ~ 5 секунд, все ajax запросы не работают вообще до завершения запуска скрипта.

На самом деле я использую прогресс для копирования файлов, и когда я выбираю большой файл, после 30% обработки ajax не работает, чтобы получить процент прогресса.

Если вы проверите мой вопрос, вы поймете, что я говорю.

Copy.php

$f = mysql_query(" select * from `process` ");
$f = mysql_fetch_assoc($f);
$total_bytes_readed = $f['total-bytes-readed'];
$total_bytes = $f['total-bytes'];
$abort = $f['state'] == 'abort'?true:false;
$remote = fopen($src, 'r');
$local = fopen($des, 'w');
$filesize = filesize($src);
$d = strtotime(date('Y-m-d H:i:s'));
$B = $speed = $time_remaining = $read_bytes = 0;

while(!feof($remote) && !$abort) {

$field = mysql_query(" select * from `process` ");
$field = mysql_fetch_assoc($field);
if($field['state']=='abort')
{
fclose($remote);
fclose($local);
if(file_exists($des))
unlink($des);
$abort = true;
return;
}else{
$bitrate = 2048*2048;
$buffer = fread($remote, $bitrate);
fwrite($local, $buffer);
$read_bytes += $bitrate ;
$total_bytes_readed += $bitrate;
$D = strtotime(date('Y-m-d H:i:s'));
if($D-$d >=1)
{
$d = $D;
$speed = $read_bytes - $B;
$B = $read_bytes;
$total_bytes_remaining = $total_bytes - $total_bytes_readed;
$time_remaining = $total_bytes_remaining/$speed;
}
mysql_query("UPDATE `process` SET
`total-bytes-readed` = '$total_bytes_readed',
`speed` = '$speed',
`time-remaining` = '$time_remaining'
WHERE `process`.`id` =1");
}
}
fclose($remote);
fclose($local);
mysql_query("UPDATE `process` SET
`total-bytes-readed` = '$total_bytes_readed',
`speed` = '$speed',
`time-remaining` = '$time_remaining'
WHERE `process`.`id` =1");

progress.php

if(isset($_POST['cancel']) && $_POST['cancel']==1)
mysql_query("UPDATE `process` SET `state` = 'abort' WHERE `process`.`id` =1");

$f = mysql_query(" select * from `process` ");
$f = mysql_fetch_assoc($f);

$re = array('totalfiles'  => $f['total-files'],
'totalbytes'  => $f['total-bytes'],
'bytesreaded' => $f['total-bytes-readed'],
'file'        => $f['file'],
'from'        => $f['from'],
'to'          => $f['to'],
'speed'       => ByteToSize($f['speed'])."/Second",
'time'        => seconds_to_time($f['time-remaining']),
'items'       => $f['items-remaining'],
'state'       => $f['state'],
);
echo json_encode($re);

JS

setInterval(function(){
$.post( progress.php,{cancel:cancel_val},
function(data){
//...
});
},300);

-1

Решение

Не видя этого в действии, я бы предположил, что проблема в том, что у вас есть несколько перекрывающихся ajax-запросов.

Вместо использования setInterval, вы должны установить использовать setTimeout в функции успеха вашего вызова ajax. Таким образом вы гарантируете, что всегда есть только 1 ajax-запрос одновременно.

Таким образом, ваш JavaScript будет что-то вроде:

function updateProgress() {
$.post( progress.php,{cancel:cancel_val},
function(data){
//...
setTimeout(updateProgress, 300);
});
};

updateProgress();
0

Другие решения

Других решений пока нет …