Контроль за процессом выполнения запроса на сервере.
Контроль за процессом выполнения запроса на сервере.
У меня есть БД в 2 +/- миллиона записей, нужно выполнить поиск по данной БД через загруженный файл, в файле есть 200 - 500 записей, каждая запись состоит из 2х полей.
1. Отправляю файл на сервер.
2. Начинаю его парсинг по строкам.
3. Начинаю парсинг строки по столбцам
4. Выполняю поиск по столбцу №1
5. Если не нашлось на прошлом этапе, выполняю поиск по второму столбцу.
6. Если запись найдена, пишу в файл, если нет, ищем следующую строку (п.4)
7. По завершении отдаю файл пользователю.
Если файл не большой, то все норм, времени хватает и запрос выполняется.
Но когда файл побольше, то не хватает времени ожидания Apache, конечно можно поставить миллион секунд, и Apache будет вечно ждать ответа от PHP-FPM. Но хотелось бы более изящного варианта, например периодический запрос о процессе выполнения. С последующим прогресс бара.
Только не представляю как оно должно происходить..
PS. Apache запрос обрывает, но Yii продолжает поиск. Как вариант конечно запомнить в сессии что этот пользователь выполнял поиск и при следующем входе напомнить ему о нем, но как узнать что поиск завершился, а если нет, сообщить что поиск еще идет.
1. Отправляю файл на сервер.
2. Начинаю его парсинг по строкам.
3. Начинаю парсинг строки по столбцам
4. Выполняю поиск по столбцу №1
5. Если не нашлось на прошлом этапе, выполняю поиск по второму столбцу.
6. Если запись найдена, пишу в файл, если нет, ищем следующую строку (п.4)
7. По завершении отдаю файл пользователю.
Если файл не большой, то все норм, времени хватает и запрос выполняется.
Но когда файл побольше, то не хватает времени ожидания Apache, конечно можно поставить миллион секунд, и Apache будет вечно ждать ответа от PHP-FPM. Но хотелось бы более изящного варианта, например периодический запрос о процессе выполнения. С последующим прогресс бара.
Только не представляю как оно должно происходить..
PS. Apache запрос обрывает, но Yii продолжает поиск. Как вариант конечно запомнить в сессии что этот пользователь выполнял поиск и при следующем входе напомнить ему о нем, но как узнать что поиск завершился, а если нет, сообщить что поиск еще идет.
Re: Контроль за процессом выполнения запроса на сервере.
А в процессе п.2 и 3 SQL-запрос нереально сформировать что ли?
Сделай выборку по всем значениям из 1-го столбца, потом по всем из 2-го, потом ч/з array_diff их склей.
Сделай выборку по всем значениям из 1-го столбца, потом по всем из 2-го, потом ч/з array_diff их склей.
Последний раз редактировалось masson 2021.04.16, 11:59, всего редактировалось 1 раз.
- proctoleha
- Сообщения: 298
- Зарегистрирован: 2016.07.10, 19:00
Re: Контроль за процессом выполнения запроса на сервере.
Ну вообще для таких трудоемких задач есть очереди
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
Re: Контроль за процессом выполнения запроса на сервере.
как-то так
1. создается таблица в БД для очереди вот таких задач и crud к этой таблице
2. вместо загрузки файла - создание записи в эту таблицу(с прикреплением файла)
3. у задач статусы в очереди, в процессе, завершено, ошибка
4. через yii-queue или по крону запускается выполнение заданий(т.е. ваши пункты 2-6)
5. после завершения результат пишется в файл и прикрепляется к задаче, статус меняется на завершено, в списке задач можно скачать файл с результатом
1. создается таблица в БД для очереди вот таких задач и crud к этой таблице
2. вместо загрузки файла - создание записи в эту таблицу(с прикреплением файла)
3. у задач статусы в очереди, в процессе, завершено, ошибка
4. через yii-queue или по крону запускается выполнение заданий(т.е. ваши пункты 2-6)
5. после завершения результат пишется в файл и прикрепляется к задаче, статус меняется на завершено, в списке задач можно скачать файл с результатом
Re: Контроль за процессом выполнения запроса на сервере.
почему по одной?
Имеется в виду запуск задания "Распарсить файл, выполнить поиск, сохранить результат". Что там внутри этого задания будет - это уже нюансы
Re: Контроль за процессом выполнения запроса на сервере.
Погодите, смотрите, файл отправился с ПК пользователя, распарсился по строкам (получается загрузился в массив, и сидит в памяти), далее строки распарсили по столбцам.
А потом начали с ними работу.
И вот эту работу бы видеть в прогресс баре, пока PHP выполняет работу.
В памяти то оно будет быстрее работать.
Сейчас еще одна интересная особенность:
Загрузил файл в 70 000 строк, нормально все отработало.
Загрузил файл в 80 000 (и более) строк, нормально все тработало, но с нормальным ответом почему то браузер получает заголовок не 200, а 500 и Ajax обрабатывает нормальный ответ как ошибку, более того, Yii не записывает файл для дебага...
А потом начали с ними работу.
И вот эту работу бы видеть в прогресс баре, пока PHP выполняет работу.
В памяти то оно будет быстрее работать.
Сейчас еще одна интересная особенность:
Загрузил файл в 70 000 строк, нормально все отработало.
Загрузил файл в 80 000 (и более) строк, нормально все тработало, но с нормальным ответом почему то браузер получает заголовок не 200, а 500 и Ajax обрабатывает нормальный ответ как ошибку, более того, Yii не записывает файл для дебага...
Re: Контроль за процессом выполнения запроса на сервере.
завтра там будет 90 000 строк, через месяц 200 000 и в бд не 2 миллиона, а 5 миллионов строк, будете опять переделывать? не обрабатываются такие задачи через браузер, нужно из консоли. прогресс бар кстати тоже можно сделать при выполнении в консоли.killer67 писал(а): ↑2021.04.16, 12:21 Погодите, смотрите, файл отправился с ПК пользователя, распарсился по строкам (получается загрузился в массив, и сидит в памяти), далее строки распарсили по столбцам.
А потом начали с ними работу.
И вот эту работу бы видеть в прогресс баре, пока PHP выполняет работу.
В памяти то оно будет быстрее работать.
Сейчас еще одна интересная особенность:
Загрузил файл в 70 000 строк, нормально все отработало.
Загрузил файл в 80 000 (и более) строк, нормально все тработало, но с нормальным ответом почему то браузер получает заголовок не 200, а 500 и Ajax обрабатывает нормальный ответ как ошибку, более того, Yii не записывает файл для дебага...
Re: Контроль за процессом выполнения запроса на сервере.
Так это все равно, пусть хоть млн, это вопрос работы пользователя, я спросил как сделать контроль процесса?rak писал(а): ↑2021.04.16, 13:13завтра там будет 90 000 строк, через месяц 200 000 и в бд не 2 миллиона, а 5 миллионов строк, будете опять переделывать? не обрабатываются такие задачи через браузер, нужно из консоли. прогресс бар кстати тоже можно сделать при выполнении в консоли.killer67 писал(а): ↑2021.04.16, 12:21 Погодите, смотрите, файл отправился с ПК пользователя, распарсился по строкам (получается загрузился в массив, и сидит в памяти), далее строки распарсили по столбцам.
А потом начали с ними работу.
И вот эту работу бы видеть в прогресс баре, пока PHP выполняет работу.
В памяти то оно будет быстрее работать.
Сейчас еще одна интересная особенность:
Загрузил файл в 70 000 строк, нормально все отработало.
Загрузил файл в 80 000 (и более) строк, нормально все тработало, но с нормальным ответом почему то браузер получает заголовок не 200, а 500 и Ajax обрабатывает нормальный ответ как ошибку, более того, Yii не записывает файл для дебага...
На примере того что используется в тех же системах как Joomla, drupal, nextcloud и подобные им.
Там при установке заполняется прогресс бар, страница периодически шлет запрос на сервер.
В Nexcloud например вообще в браузере идет прогресбар и при необходимости можно развернуть спойлер, а там будут бежать обработаные строки и статус их выполнения.
Если можете подсказать как это сделать, то с меня "+", если нет, то не нужно писать, мол это так не делается, это надо делать по другому и т.п.
PS. Раз уж заговорили про консоль, то и тут вопрос:
Как отследить появление файла или что надо запустить, что бы после загрузки файла на сервер (через браузер) активировать консольное выполнение обработки этого файла?
Re: Контроль за процессом выполнения запроса на сервере.
1. В процессе обработки цифирку сколько процентов обработано (или какая строчка обрабатывается) скидывать в отдельный файл, по таймеру аяксом его считывать и показывать прогресс бар. Если файла нет или дата обновления не меняется - отключаться.
2. Запустить консольную команду из браузера или аяксом можно так - https://onfor.info/yii2-kak-vypolnit-ko ... rauzera-2/
2. Запустить консольную команду из браузера или аяксом можно так - https://onfor.info/yii2-kak-vypolnit-ko ... rauzera-2/
Re: Контроль за процессом выполнения запроса на сервере.
Спасибо, хоть кто то дал ответ на вопрос.masson писал(а): ↑2021.04.25, 16:22 1. В процессе обработки цифирку сколько процентов обработано (или какая строчка обрабатывается) скидывать в отдельный файл, по таймеру аяксом его считывать и показывать прогресс бар. Если файла нет или дата обновления не меняется - отключаться.
2. Запустить консольную команду из браузера или аяксом можно так - https://onfor.info/yii2-kak-vypolnit-ko ... rauzera-2/