Динамический вывод данных

Fenslau

Новичок
Привет всем!
Есть скрипт, который работает долго.
В процессе его работы нужно что-то выводить пользователю. Однако, как оказалось, это проблема!
Все эти данные записываются в какой-то там буфер и выводятся кучей после завершения работы скрипта!
Гуглил на эту тему, но то, что советуют там - не помогает, flush(); не работает! Всевозможные принудительные заполнения буфера всяким хламом -не помогают, да и это какая-то дичь - в 2019 году забивать буферы чтобы вывести что скрипт выполнился на 10% !?
Может быть есть какое-то простое и элегантное решение, которое бы не потребовало изучение нового языка программирования?
Слышал, что это как-то можно решить с помощью javascript, но что в этом javascript писать - нигде толком не сказано! Опять же! Как вывести эти строчки яваскрипта в браузер до завершения работы скрипта пхп?
 

fixxxer

К.О.
Партнер клуба
Самое простое - записывать куда-то текущий статус работы, отдельным php-скриптом его выдавать, js-ом его дергать раз в секунду.
 

Fenslau

Новичок
Самое простое - записывать куда-то текущий статус работы, отдельным php-скриптом его выдавать, js-ом его дергать раз в секунду.
да, спасибо, сам к такому способу пришел в результате. просто не знал, как именно дергать аяксом, но уже нашел. пишу в базу рабочим скриптом, вывожу простеньким вспомогательным, а дергаю вот такой штуковиной:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="example">

</div>

<script>
function show()
{
$.ajax({
url: "script.php",
success: function(data){
$("#example").html(data);
}
});
};
$(document).ready(function(){
show();
setInterval("show()",300);
});
</script>
 

AnrDaemon

Продвинутый новичок
Самое простое - НЕ делать ничего долгого в процессе запроса.
Скидываешь задачу в очередь обработки и отдаёшь 202 клиенту.
 

Reuniko

Новичок
Есть вероятность что flush() не работает, потому что включена буферизация, причем возможно несколько уровней.
Чтобы полностью отрубить буферизацию:
PHP:
<?
while(ob_end_clean()) {
    // do nothing
}
flush();
 

Fenslau

Новичок
Есть вероятность что flush() не работает, потому что включена буферизация, причем возможно несколько уровней.
Чтобы полностью отрубить буферизацию:
PHP:
<?
while(ob_end_clean()) {
    // do nothing
}
flush();
Такая конструкция тоже не помогает!
пишет: Notice: ob_end_clean(): failed to delete buffer. No buffer to delete
Но при этом выводить не торопится до завершения всего скрипта!
Да пёс с ним....! Я уже свыкся что через аякс всё это делать приходится.
 

Fenslau

Новичок
Можно обойтись и без jquery. В браузерах есть функция fetch, для IE есть полифилл.
Я уже свыкся что через аякс всё это делать приходится. Единственно, я не очень разбираюсь в яваскрипте....
Мне бы надо дергать только когда запрос выполняется. А когда он уже выполнен - чего зря дёргать то ))
только вот что бы такое написать вместо $(document).ready(function() чтобы она работала только пока крутится в браузере индикатор загрузки страницы....
 

Reuniko

Новичок
В этом случае обычно пишут
- PHP скрипт таким образом, чтобы он выполнял весь объем работы пошагово, а в результате выдавал json для аякса с данными о том какой % работы выполнен и нужно ли запустить его в очередной раз,
- аякс скрипт таким образом, чтобы он дергал PHP-скрипт пока тот отвечает что его нужно дернуть еще раз
 

Reuniko

Новичок
JavaScript:
function SynchronizeNext() {
    $.ajax({
        url: 'settings.php?lang=ru&mid=<?=$module_id?>&mid_menu=1',
        dataType: 'json',
        method: 'POST',
        data: {action: 'SynchronizeNext'},
        error: function (data) {
            // error
        },
        success: function (data) {
            // echo progress
            if (data.TYPE != 'DONE') {
                SynchronizeNext();
            } else {
                // echo 'jobs done'
            }
        }
    });
}
 

Fenslau

Новичок
так если пхп скрипт ответит, что его дергать больше не нужно, как тогда аякс узнает, что может быть снова пора? Если пользователь снова запросил выполнение скрипта.
А то есть в яваскрипте нет такого .... обработчика событий что ли, или как это правильно сказать то ... ну то есть - "пока крутится индикатор".. Не знаю, как это грамотно назвать и как загуглить тоже не знаю.
Сейчас у меня основной скрипт пишет состояние своего прогресса в базу данных. вспомогательный скрипт (за который дергает аякс) - обращается к базе данных и выводит это сообщение (если там что-то есть).
А аякс постоянно дергает этот вспомогательный скрипт. Когда страница загрузилась - начинает сразу. Даже если пока пользователь не запросил на ней работу основного скрипта. Потом дёргает во время работы скрипта - и успешно обновляет прогресс. А когда скрипт заканчивает работу - продолжает дергать (только при этом ничего уже не выводится.
Но как то же можно дать ему понять, что дергать нужно только в те моменты, когда страница крутится-вертится....
 
Сверху