Задать вопрос
@Evdokim001
PHP & WordPress developer

Как получить код во время работы PHP на фронте?

Необходимо решить проблему связанную с Progressbar. Как получить во время выполнения PHP какой-либо текст или цифры, например проценты отдельно до полного сформирования success.
$.ajax() и $.post() отдают данные только в конце. У $.ajax() есть метод xhr. У этого метода есть progress, но как получить данные в момент pending не монимаю как получить.
То есть мне нужно получить echo в момент echo а не когда все сформируется. Как это можно сделать?
Есть идея, после всех проверок вернуть AJAX и включить progressbar. Отправить сного AJAX получить результат частичный и сново вернуть. И так отправлять получать до 100%. Но вот только насильство какое-то выходит над сервером помоему.
  • Вопрос задан
  • 229 просмотров
Подписаться 1 Средний 5 комментариев
Решения вопроса 1
delphinpro
@delphinpro Куратор тега PHP
frontend developer
Пригласить эксперта
Ответы на вопрос 1
xEpozZ
@xEpozZ
Веб-разработчик
То есть мне нужно получить echo в момент echo а не когда все сформируется. Как это можно сделать?


В какой момент и что получить?

----------

Вы бы рассказали, что вы делаете на сервере, а из этого уже можно делать выводы в пользу того или иного решения.

Я, честно говоря, ничего не понял, что вы написали в описании и отвечу на вопрос "Как сделать progress bar для долгого процесса на PHP":

Для упрощения моих примеров, давайте расскажу про процесс доставки еды.
У этого процесса мы сделаем 4 этапа:
1. Отправить заказ и получить подтверждение от провайдера услуги – ресторан, который приготовит нам на вечер роллы и пиццу, да чтобы без сухой корочки.
2. Найти курьера и отправить его в ресторан ждать заказ.
3. Подождать пока ресторан приготовит заказ.
4. Доставить заказ голодному клиенту.

-----

Вам нужно хранилище для логирования этапов выполнения процесса: SQL, NoSQL, файловое или другие хранилища.
Советую выделить несколько свойств у процесса:
1. Этап выполнения. Будем называть его State в дальнейшем.
2. Общий прогресс. Его назовём Total progress.

Дальше можете немного упороться и создать логирование выполнения каждого из этапов. Но уже без меня ;)

После поступления запроса на выполнение вашего сложного процесса вам нужно создать новую запись в хранилище и отдать ID этой записи в ответ на запрос. На фронтенд, в вашем случае.

Следующим этапом вам нужно подключить логирование переходов состояний в места их начала. Код будет примерно таким:
$state->setState("first state");
$storage->save($state);
// Отправить запрос на готовку заказа
// ...
// Ответ положительный

$state->setState("second state");
$storage->save($state);
// Найти курьера
// ...
// Курьер найден

$state->setState("first state");
$storage->save($state);


Этапы логируются, теперь нужно на фротенде показать изменения процесса.
Создаем новый endpoint, который будет:
1. Принимать id процесса, который мы отдали фронту при создании процесса
2. Идти в хранилище и смотреть текущий этап и сколько их всего. В нашем примере их всего 4.
3. Делать нужный вам подсчет. Например, говорить "мы сейчас на 2 из 4 этапов" или 2 делить на 4 и говорить "50% процесса выполнено". Как вам больше понравится, так и делайте.

----------------

Думаю, я неплохо ответил на свой вопрос, да еще и вам накинул идей :)
Ответ написан
Ваш ответ на вопрос

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

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