如何在 Ajax 请求大量数据库更新时实现进度条
How to implements Progress bar when doing Ajax request Voluminous db updates
早上好,
我有更新大量数据的脚本(例如 3000 行),我必须在进度条上向用户显示数据库更新的进度或仅显示受影响的行数。
我正在研究 PHP codeigniter 和 AJAX
我有一个想法使用会话 codeigniter 在每个循环的会话值上存储修改后的变量(增量)并调用将会话变量作为 JSON 数组给我的函数,但问题是会话不会改变第一次更新后本身(例如:从 0 开始并修改为 20,之后所有进程都在 20)
我不知道如何获得更好的解决方案。如果你能帮助我,那就太好了。
感谢大家
PHP 在脚本完全完成之前不会输出任何内容,但您可以更改它:
ob_implicit_flush(true);
for ($i = 0; $i < ob_get_level(); $i++) {
ob_end_clean();
}
在开始处理数据之前,将其放入 PHP 脚本中。当你处理部分数据时,输出一些东西来告诉 AJAX 请求进度;例如:
PHP:
$completed_updates = 0;
$last_echoed_progress = 0;
$progress_echo_interval_seconds = 2;
while ($completed_updates < $amount_of_db_updates_to_do) {
do_db_update();
$completed_updates++;
if ($last_echoed_progress + $progress_echo_interval_seconds < time()) {
echo ($completed_updates / $amount_of_db_updates_to_do) * 100;
$last_echoed_progress = time();
}
}
jQuery 的 .ajax 也(默认情况下)在收到所有数据(即脚本结束)之前不会使用数据调用成功函数,因此创建自定义带有事件侦听器的 XHR 对象在脚本仍在运行时接收数据 运行ning:
JS:
var last_response_length = 0;
$.ajax({
... // All your other settings
xhr: function() {
var xhr = new XMLHttpRequest(); // Create a custom XHR object
xhr.onprogress = function(data) {
var response = data.currentTarget.response, // Get the output
progress = response.slice(last_response_length) | 0; // Remove old output
$( '#progress-bar' ).val(progress); // Update the progress bar
last_response_length = response.length; // Track where the old data is (so they can be removed when new data is received)
};
return xhr; // IMPORTANT! Return the custom XHR for .ajax to use
},
success: function(response) {
$( '#progress-bar' ).val(100); // All done!
}
});
显然修改代码以满足您的需要,并进行一些试验。请记住,PHP 默认情况下的执行时间限制为 30 秒,因此您可能需要在脚本中更改它:
set_time_limit(0);
这允许您的脚本(并且只有那个)运行 没有时间限制。把它放在最上面。谨慎使用!
早上好, 我有更新大量数据的脚本(例如 3000 行),我必须在进度条上向用户显示数据库更新的进度或仅显示受影响的行数。 我正在研究 PHP codeigniter 和 AJAX 我有一个想法使用会话 codeigniter 在每个循环的会话值上存储修改后的变量(增量)并调用将会话变量作为 JSON 数组给我的函数,但问题是会话不会改变第一次更新后本身(例如:从 0 开始并修改为 20,之后所有进程都在 20)
我不知道如何获得更好的解决方案。如果你能帮助我,那就太好了。 感谢大家
PHP 在脚本完全完成之前不会输出任何内容,但您可以更改它:
ob_implicit_flush(true);
for ($i = 0; $i < ob_get_level(); $i++) {
ob_end_clean();
}
在开始处理数据之前,将其放入 PHP 脚本中。当你处理部分数据时,输出一些东西来告诉 AJAX 请求进度;例如:
PHP:
$completed_updates = 0;
$last_echoed_progress = 0;
$progress_echo_interval_seconds = 2;
while ($completed_updates < $amount_of_db_updates_to_do) {
do_db_update();
$completed_updates++;
if ($last_echoed_progress + $progress_echo_interval_seconds < time()) {
echo ($completed_updates / $amount_of_db_updates_to_do) * 100;
$last_echoed_progress = time();
}
}
jQuery 的 .ajax 也(默认情况下)在收到所有数据(即脚本结束)之前不会使用数据调用成功函数,因此创建自定义带有事件侦听器的 XHR 对象在脚本仍在运行时接收数据 运行ning:
JS:
var last_response_length = 0;
$.ajax({
... // All your other settings
xhr: function() {
var xhr = new XMLHttpRequest(); // Create a custom XHR object
xhr.onprogress = function(data) {
var response = data.currentTarget.response, // Get the output
progress = response.slice(last_response_length) | 0; // Remove old output
$( '#progress-bar' ).val(progress); // Update the progress bar
last_response_length = response.length; // Track where the old data is (so they can be removed when new data is received)
};
return xhr; // IMPORTANT! Return the custom XHR for .ajax to use
},
success: function(response) {
$( '#progress-bar' ).val(100); // All done!
}
});
显然修改代码以满足您的需要,并进行一些试验。请记住,PHP 默认情况下的执行时间限制为 30 秒,因此您可能需要在脚本中更改它:
set_time_limit(0);
这允许您的脚本(并且只有那个)运行 没有时间限制。把它放在最上面。谨慎使用!