Как передать PHP переменные сессии в JavaScript во время работы скрипта - PullRequest
0 голосов
/ 19 апреля 2020

Я использую AJAX для передачи значения в качестве параметра функции в классе, выполнение которого занимает немного времени. Я хочу отображать выходные сообщения в браузере при запуске сценария PHP.

Я попытался установить переменную сеанса в нескольких местах сценария и использую AJAX, чтобы попытаться прочитать сеанс переменная каждую секунду.

Вот код


JavaScript

<script>
    var outputs = setInterval(displayOutputMessage, 1000);

    $.post('ajax.php', {action:'run', id:12345}).then(() => {
        clearInterval(outputs);
    });

    function displayOutputMessage() {
        $.post('ajax.php', {action:'getOutputMessages'}).then(data => {
            if (data !== 'session not set') {
                $('#output').html(data);
            }
        });
    }
</script>


PHP

switch ($_POST['action']) {
    case 'run':
        $x = new LongScript();
        $x->longFunction($_POST['id']);
        break;


    case 'getOutputMessages':
        echo isset($_SESSION['outputMessage']) ? $_SESSION['outputMessage'] : 'session not set';
        break;
}
session_start();

class LongScript
{
    public function longFunction($id) {
        $items = XYZ::getItems($id);
        foreach ($items as $k => $item) {

            //code omitted
            $_SESSION['outputMessage'] = "output message ($k)";

            $suppliers = XYZ::getSuppliers($item['oem'])

            foreach ($suppliers as $supplier) {
                //code omitted
                $_SESSION['outputMessage'] = "another message ($k)";
            }

        }
    }
}

Проблема, с которой я столкнулся, заключается в том, что выходные данные отображают данные переменной сеанса только после того, как длинная функция завершила свое выполнение. Выполнение сценария может занять от 45 секунд до 3 минут, а выполнение кода внутри циклов занимает некоторое время, поэтому я ожидаю увидеть некоторые другие выходные сообщения, кроме последнего. Я также попытался использовать flush() после установки переменной сеанса, и это не имело значения.

Я открыт для использования другого способа сделать то же самое, если использование сеанса для этого не возможный. Сама страница будет доступна только для менее чем 5 пользователей.

...