Как сделать прогресс бар выполнение php функции в Yii2?

Задача такая:
Через форму отправляю на сервер url страницы, она парсится, в контроллере внутри функции происходят манипуляции с dom деревом страницы - вытаскиваю все мне необходимое со страницы. Ради примера - вытащить все ссылки со страницы и поместить в массив. Ситуация складывается следующая:
Во вьюхе, для отправки данных, использую ActiveForm и Pjax, вьюха обращается в экшену index, оттуда вызывается функция Paresepage, где я получаю все ссылки со страницы, далее в этой же функции в цикле обрабатываю ссылки - формирую правильные url'ы, убираю битые ссылки, проверяю ответ от сервера и т.д.
Процесс выполняемый в функции получается достаточно трудоёмкий. Необходимо сделать следующее:
При обработке каждой ссылки внутри цикла выводить на страничу пользователю сколько ссылок уже обработано, т.е. сделать индикатор прогресса. как такое реализовать?

Вьюха:
<?php Pjax::begin(['id' => 'pjax']); ?>
        <?php $form = ActiveForm::begin(['id' => 'analise-form', 'method'                      =>    'post',]); ?>
                 <?= $form->field($model, 'site')->textInput(['maxlength' => true]); ?>
                <div class="form-group">
                    <?= Html::submitButton('Отправить', ['class' => 'btn btn-primary']) ?>
                </div>
            <?php ActiveForm::end(); ?>
                  <pre>
                    <?php if(isset($url) && isset($page_item)){
                      print_r($url);
                      print_r($page_item);
                    } ?>
                  </pre>
      <?php Pjax::end(); ?>


И код, который принимает форму и обращается в функцию парсинга:
public function actionIndex()
    {
        $model = new AnaliseForm();
        $url = '';
        $page = '';
        $page_item = '';
        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
                $url = Yii::$app->request->post();
                $url = htmlspecialchars(strip_tags($url['AnaliseForm']['site']));

                $page_item = AnaliseController::actionParesepage($url); //функция анализа ссылок на странице
        }
        return $this->render('index', [
            'model' => $model,
            'url' => $url,
            'page_item' => $page_item,
        ]);
    }


Сейчас после отправки формы страничка долго грузится и выдаёт сразу весь ответ - целиком готовый массив. Но надо сделать чтоб выводился прогресс, а ещё лучше выводить по 1 ссылке на страниц в порядке обработки.
  • Вопрос задан
  • 1444 просмотра
Пригласить эксперта
Ответы на вопрос 1
Не знаю, как на yii, но в php я бы это решил созданием очереди (контроллер создает задание и сразу возвращает ответ пользователю, далее оно исполняется воркером в фоне) и далее либо проверка текущего статуса по аяксу раз в минуту со стороны клиента, либо в обработчике очереди отправка на клиент через websockets уведомления о текущем статусе.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы