Я использую ajax jQuery для запуска сценария php с ниже:
jQuery.ajax({
type: "POST",
url: "my_php_script.php",
success: function( response ) {
console.log(response);
},
error: function(){
console.log('error is...');
}
});
my_php_script.php
проходит через массив и на каждом продукте запускается функция:
$count = count($array);
$i = 0;
foreach ($array as $item) {
myFunction($item);
$i++;
if($i == $count){
echo json_encode('all done and a success');
}
}
Это все работает, но сценарий обычно может занять около 2-3 минут, поэтому мне нужно показать прогресс зрителя во время его работы. Как я могу это сделать?
Я могу получить процент от цикла, добавив
$percent = intval($i/$count * 100)."%";
echo json_encode($percent);
в мой PHP-цикл как так:
$count = count($array);
$i = 0;
foreach ($array as $item) {
myFunction($item);
$percent = intval($i/$count * 100)."%";
echo json_encode($percent);
$i++;
if($i == $count){
echo json_encode('all done and a success');
}
}
Но как я могу получить это значение в моем jQuery-вызове ajax?
$.ajax({
url: path,
xhrFields: {
onprogress: function (e) {
}
},
success: function (response) {
}
});
Нашел этот пример, надеюсь, это поможет.
Получил это в итоге, написав процент в текстовом файле с уникальным именем, как в моем цикле массива:
$percent = intval($i/$count * 100)."%";
$_text = file_get_contents($_file);
$_text = $percent;
file_put_contents($_file, $_text);
И затем в моей html-странице я проверяю содержимое файла каждые 2 секунды:
jQuery.get('file.txt?'+new Date(), function(data) {
console.log(data);
}, 'text');
Я уверен, что это не лучший способ сделать это, но заставить это работать в ограниченный период времени — это все, что я мог придумать. Надеюсь, это поможет кому-то еще