Я пытаюсь сделать какой-то индикатор прогресса для простого цикла php.
Здесь есть много вопросов по ajax/php, касающихся прогресса и циклов php, но после читая их много, я до сих пор не могу реализовать (и точно понять) логику..
Большинство из них либо говорят о -upload- индикаторе выполнения, либо слишком привязаны к конкретному случаю (либо так, либо я не знаю, как выбрать правильные ключевые слова для поиска).
Моя конечная цель — сделать индикатор выполнения, но для начала я попробовал небольшой эхо-цикл.
Я пробовал следующее:
HTML-форма:
<p class="submit">
<input type="submit" class="button-primary" id="o99_sudi_do_now" value="<?php _e('DO IT NOW !', 'o99_sudi_domain'); ?>" />
<img src="<?php echo admin_url('/images/wpspin_light.gif'); ?>" class="waiting" id="o99_sudi_loading" style="display:none;"/>
</p>
<div id="o99_sudi_results"></div>
JQuery
jQuery(document).ready(function($){
jQuery('#o99_sudi_do_now_form').click(function(e){
e.preventDefault();
jQuery.post(ajaxurl,{action:'o99_random_loop'}, function(data){
jQuery('#o99_sudi_results').empty().append( data );
});
});
});
PHP
function o99_random_loop_cb(){
for ($i = 0; $i < 10; $i++) {
//ob_end_clean(); // [TESING]
echo '-- step' .$i . ' of 10</br>';
//flush();// [TESING]
//usleep(100000000000*0.1); // total time 10 sec.// [TESING]
//ob_flush();// [TESING]
usleep(20000);
}
die();
и так как все это находится в административной области WordPress -
add_action( 'wp_ajax_o99_random_loop', 'o99_random_loop_cb' );
результат (или вывод):
-- Step 0 of 10
-- Step 1 of 10
-- Step 2 of 10
-- Step 3 of 10
-- Step 4 of 10
-- Step 5 of 10
-- Step 6 of 10
-- Step 7 of 10
-- Step 8 of 10
-- Step 9 of 10
это нормально, но проблема в том, что вывод поступает, и div обновляется только после завершения выполнения - и я хочу, чтобы он обновлялся на лету, шаг за шагом... (мой реальный запланированный цикл довольно долго и займет около 2-3 секунд для итерации. )
Как вы можете видеть в коде, я пробовал flush();
, ob_flush();
и любые другие предложения, которые я видел, но я подозреваю, что ЛОГИКА здесь неверна (потому что это wordpress?? или сброс в неправильном месте?) и на самом деле нет независимо от того, сколько я flush()
; - результат приходит только тогда, когда функция ЗАВЕРШАЕТСЯ..
Моя цель сделать прогресс бар - а пока даже помощь с простым эхом прогресса будет здорово..