Контроль за процессом выполнения запроса на сервере.

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
killer67
Сообщения: 13
Зарегистрирован: 2018.11.14, 14:41

Контроль за процессом выполнения запроса на сервере.

Сообщение killer67 »

У меня есть БД в 2 +/- миллиона записей, нужно выполнить поиск по данной БД через загруженный файл, в файле есть 200 - 500 записей, каждая запись состоит из 2х полей.
1. Отправляю файл на сервер.
2. Начинаю его парсинг по строкам.
3. Начинаю парсинг строки по столбцам
4. Выполняю поиск по столбцу №1
5. Если не нашлось на прошлом этапе, выполняю поиск по второму столбцу.
6. Если запись найдена, пишу в файл, если нет, ищем следующую строку (п.4)
7. По завершении отдаю файл пользователю.

Если файл не большой, то все норм, времени хватает и запрос выполняется.
Но когда файл побольше, то не хватает времени ожидания Apache, конечно можно поставить миллион секунд, и Apache будет вечно ждать ответа от PHP-FPM. Но хотелось бы более изящного варианта, например периодический запрос о процессе выполнения. С последующим прогресс бара.

Только не представляю как оно должно происходить..

PS. Apache запрос обрывает, но Yii продолжает поиск. Как вариант конечно запомнить в сессии что этот пользователь выполнял поиск и при следующем входе напомнить ему о нем, но как узнать что поиск завершился, а если нет, сообщить что поиск еще идет.
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Контроль за процессом выполнения запроса на сервере.

Сообщение masson »

А в процессе п.2 и 3 SQL-запрос нереально сформировать что ли?

Сделай выборку по всем значениям из 1-го столбца, потом по всем из 2-го, потом ч/з array_diff их склей.
Последний раз редактировалось masson 2021.04.16, 11:59, всего редактировалось 1 раз.
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Контроль за процессом выполнения запроса на сервере.

Сообщение proctoleha »

Ну вообще для таких трудоемких задач есть очереди
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Контроль за процессом выполнения запроса на сервере.

Сообщение rak »

как-то так
1. создается таблица в БД для очереди вот таких задач и crud к этой таблице
2. вместо загрузки файла - создание записи в эту таблицу(с прикреплением файла)
3. у задач статусы в очереди, в процессе, завершено, ошибка
4. через yii-queue или по крону запускается выполнение заданий(т.е. ваши пункты 2-6)
5. после завершения результат пишется в файл и прикрепляется к задаче, статус меняется на завершено, в списке задач можно скачать файл с результатом
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Контроль за процессом выполнения запроса на сервере.

Сообщение masson »

rak писал(а): 2021.04.16, 11:11 4. через yii-queue или по крону запускается выполнение заданий(т.е. ваши пункты 2-6)
Выбирать из БД записи по одной, а внутри строки еще и вместо условия OR использовать 2-ой запрос при неудачном первом - так себе удовольствие :?
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Контроль за процессом выполнения запроса на сервере.

Сообщение rak »

masson писал(а): 2021.04.16, 12:07
rak писал(а): 2021.04.16, 11:11 4. через yii-queue или по крону запускается выполнение заданий(т.е. ваши пункты 2-6)
Выбирать из БД записи по одной, а внутри строки еще и вместо условия OR использовать 2-ой запрос при неудачном первом - так себе удовольствие :?
почему по одной?
Имеется в виду запуск задания "Распарсить файл, выполнить поиск, сохранить результат". Что там внутри этого задания будет - это уже нюансы
killer67
Сообщения: 13
Зарегистрирован: 2018.11.14, 14:41

Re: Контроль за процессом выполнения запроса на сервере.

Сообщение killer67 »

Погодите, смотрите, файл отправился с ПК пользователя, распарсился по строкам (получается загрузился в массив, и сидит в памяти), далее строки распарсили по столбцам.
А потом начали с ними работу.

И вот эту работу бы видеть в прогресс баре, пока PHP выполняет работу.

В памяти то оно будет быстрее работать.

Сейчас еще одна интересная особенность:
Загрузил файл в 70 000 строк, нормально все отработало.
Загрузил файл в 80 000 (и более) строк, нормально все тработало, но с нормальным ответом почему то браузер получает заголовок не 200, а 500 и Ajax обрабатывает нормальный ответ как ошибку, более того, Yii не записывает файл для дебага...
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Контроль за процессом выполнения запроса на сервере.

Сообщение rak »

killer67 писал(а): 2021.04.16, 12:21 Погодите, смотрите, файл отправился с ПК пользователя, распарсился по строкам (получается загрузился в массив, и сидит в памяти), далее строки распарсили по столбцам.
А потом начали с ними работу.

И вот эту работу бы видеть в прогресс баре, пока PHP выполняет работу.

В памяти то оно будет быстрее работать.

Сейчас еще одна интересная особенность:
Загрузил файл в 70 000 строк, нормально все отработало.
Загрузил файл в 80 000 (и более) строк, нормально все тработало, но с нормальным ответом почему то браузер получает заголовок не 200, а 500 и Ajax обрабатывает нормальный ответ как ошибку, более того, Yii не записывает файл для дебага...
завтра там будет 90 000 строк, через месяц 200 000 и в бд не 2 миллиона, а 5 миллионов строк, будете опять переделывать? не обрабатываются такие задачи через браузер, нужно из консоли. прогресс бар кстати тоже можно сделать при выполнении в консоли.
killer67
Сообщения: 13
Зарегистрирован: 2018.11.14, 14:41

Re: Контроль за процессом выполнения запроса на сервере.

Сообщение killer67 »

rak писал(а): 2021.04.16, 13:13
killer67 писал(а): 2021.04.16, 12:21 Погодите, смотрите, файл отправился с ПК пользователя, распарсился по строкам (получается загрузился в массив, и сидит в памяти), далее строки распарсили по столбцам.
А потом начали с ними работу.

И вот эту работу бы видеть в прогресс баре, пока PHP выполняет работу.

В памяти то оно будет быстрее работать.

Сейчас еще одна интересная особенность:
Загрузил файл в 70 000 строк, нормально все отработало.
Загрузил файл в 80 000 (и более) строк, нормально все тработало, но с нормальным ответом почему то браузер получает заголовок не 200, а 500 и Ajax обрабатывает нормальный ответ как ошибку, более того, Yii не записывает файл для дебага...
завтра там будет 90 000 строк, через месяц 200 000 и в бд не 2 миллиона, а 5 миллионов строк, будете опять переделывать? не обрабатываются такие задачи через браузер, нужно из консоли. прогресс бар кстати тоже можно сделать при выполнении в консоли.
Так это все равно, пусть хоть млн, это вопрос работы пользователя, я спросил как сделать контроль процесса?
На примере того что используется в тех же системах как Joomla, drupal, nextcloud и подобные им.
Там при установке заполняется прогресс бар, страница периодически шлет запрос на сервер.
В Nexcloud например вообще в браузере идет прогресбар и при необходимости можно развернуть спойлер, а там будут бежать обработаные строки и статус их выполнения.

Если можете подсказать как это сделать, то с меня "+", если нет, то не нужно писать, мол это так не делается, это надо делать по другому и т.п.

PS. Раз уж заговорили про консоль, то и тут вопрос:
Как отследить появление файла или что надо запустить, что бы после загрузки файла на сервер (через браузер) активировать консольное выполнение обработки этого файла?
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Контроль за процессом выполнения запроса на сервере.

Сообщение masson »

1. В процессе обработки цифирку сколько процентов обработано (или какая строчка обрабатывается) скидывать в отдельный файл, по таймеру аяксом его считывать и показывать прогресс бар. Если файла нет или дата обновления не меняется - отключаться.
2. Запустить консольную команду из браузера или аяксом можно так - https://onfor.info/yii2-kak-vypolnit-ko ... rauzera-2/
killer67
Сообщения: 13
Зарегистрирован: 2018.11.14, 14:41

Re: Контроль за процессом выполнения запроса на сервере.

Сообщение killer67 »

masson писал(а): 2021.04.25, 16:22 1. В процессе обработки цифирку сколько процентов обработано (или какая строчка обрабатывается) скидывать в отдельный файл, по таймеру аяксом его считывать и показывать прогресс бар. Если файла нет или дата обновления не меняется - отключаться.
2. Запустить консольную команду из браузера или аяксом можно так - https://onfor.info/yii2-kak-vypolnit-ko ... rauzera-2/
Спасибо, хоть кто то дал ответ на вопрос.
Ответить