我试图让进度条观看长PHP函数(+/- 5分钟)。 这个长PHP函数读取CSV文件并在SQL数据库中插入每一行。
在这里,我使用示例PHP长函数(+/- 10s)进行测试。 对于传递的每个循环,值在db&#39> app_loader '中增加。
此函数与ajax调用(POST)异步启动。
我已经制作了一个PHP函数来观察"这个示例长PHP函数。 它查询数据库' app_loader '表格来获取字段' loader_state '和' loader_total '。 此函数返回(echo)json数组,其中包含' load '百分比和' 结束'状态(真或假)。
此函数与ajax调用(GET)异步启动,每500ms重复一次。
我的问题是:观察者ajax调用工作但仅在长任务ajax调用结束时返回值。 因此,当长时间的ajax调用开始时,没有任何东西返回的加载器栏就有点无聊了:(
ajax观察者的结果(每500毫秒):1,2,[...],99,100%
提前多多感谢!
PHP长任务示例函数:
function read_csv($name, $path)
{
$row = 1;
while($row < 10)
{
// Process (read CSV file and do something)
// Set progression in db
$query = "UPDATE app_loader SET loader_state = :loader_state, loader_total = :loader_total WHERE loader_name = :loader_name";
$query = self::$db->prepare($query);
$query->bindValue(':loader_name', 'csv_read', \PDO::PARAM_STR);
$query->bindValue(':loader_state', $row, \PDO::PARAM_INT);
$query->bindValue(':loader_total', 9, \PDO::PARAM_INT);
$query->execute();
$query = null;
sleep(1);
$row++;
}
echo json_encode(array('task_ended' => true));
}
PHP观察者功能:
function read_csv_progress()
{
$query = "SELECT loader_state, loader_total FROM app_loader WHERE loader_name = :loader_name";
$query = self::$db->prepare($query);
$query->bindValue(':loader_name', 'csv_read', \PDO::PARAM_STR);
$query->execute();
$row = $query->fetch(\PDO::FETCH_OBJ);
$query = null;
if($row->loader_state == $row->loader_total)
{
echo json_encode(array('load' => self::progress_percent(($row->loader_total), $row->loader_state), 'ended' => true));
}else{
echo json_encode(array('load' => self::progress_percent(($row->loader_total), $row->loader_state), 'ended' => false));
}
}
ajax长任务调用函数:
function processLongPHPTask(filename, filepath) {
// Launch watcher
checkProgress();
$.ajax({
type: 'POST',
url: '/api/map/read/csv/global',
data: 'name=' + filename + '&path=' + filepath,
dataType: 'json',
beforeSend: function (xhr) {
xhr.setRequestHeader(
'Authorization',
'Bearer ' + JWT
);
},
success: function (data) {
if (data.task_ended) {
console.log('task ended');
}
},
error: function (xhr, ajaxOptions, thrownError) {
console.log({
type: 'error',
trace: 'processLongPHPTask',
message: {'status': xhr.status, 'error': thrownError}
});
}
});
}
ajax观察者呼叫功能:
function checkProgress() {
// Where I call read_csv_progress() from PHP
$.ajax({
type: 'GET',
url: '/api/map/read/csv/global',
dataType: 'json',
beforeSend: function (xhr) {
xhr.setRequestHeader(
'Authorization',
'Bearer ' + JWT
);
},
success: function (data) {
if (data.ended) {
console.log('data process ended');
} else {
console.log('data progress : ' + data.load);
// Restart the watcher each 500 ms
setTimeout( checkProgress, 500 );
}
},
error: function (xhr, ajaxOptions, thrownError) {
console.log({
type: 'error',
trace: 'checkProgress',
message: {'status': xhr.status, 'error': thrownError}
});
}
});
}