Задать вопрос
ilyautkin
@ilyautkin

Решение для реализации обработки файла по частям (например, для импорта)?

Необходимо сделать импорт записей для сайта. Импорт будет или с помощью XML, или CSV.



Проблема в том, что обрабатывать большой файл долго и скрипт оборвется либо по времени работы PHP, либо пользователь может ненароком закрыть страницу, на которой идет обработка.



Хочется сделать, чтобы PHP обрабатывал сначала одну строку, потом возвращал сообщение об успехе, а с клиента приходил запрос на обработку следующей строки.



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



Интересует, есть ли с одной стороны простое, с другой стороны универсальное решение такой задачи?
  • Вопрос задан
  • 4800 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
ilyautkin
@ilyautkin Автор вопроса
Решил сам написать такой инструмент. Для моих задач вполне подойдет.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Lerg
@Lerg
Defold, Corona, Lua, GameDev
Можно файл залить целиком на сервер с формой, отображающей процент загрузки (делается через APC).
В скрипте снять ограничение на время исполнения через set_time_limit(0);
А продолжить работу после закрытия браузера через ignore_user_abort(true);

Читать файл построчно, чтобы не забивать всю оперативку и выполнять SQL INSERT на каждой строке.

За процессом обработки можно следить через создание дополнительной таблицы, куда будет записываться идентификатор загрузки, количество строк в файле, количество обработанных строк. И на отдельной странице следить за ходом выполнения.

Для увеличения скорости рекомендуется делать INSERT не по одной строчке, а хотя бы по 100.
Ответ написан
@Vampiro
Потискайте поиск, это весьма частый случай.
Как правило, Обработчик оставляют работать в фоне, и заставляют где-то хранить «текущую строку». Например, в мемкеше.
А ваш скрипт с прогрессбаром смотрит в мемкеш и отдает клиенту циферку.
Как-то так.
Ну и не забыть запустить обработчик после импорта файла. =) кто-то пользуется fork, кто-то очередями задач. Кому как удобнее.
Ответ написан
Комментировать
@egorinsk
Вы занимаетесь ерундой. Для сложных задач организуются т.н. очереди задач, то есть файл загружается на сервер, добавляется в очередь задача (обработать файл), пинается демон, скрипт на этом завершается, показывает сообщение «ждите», а в то же время демон видит новую задачу, запускает скрипт обработки, периодически обновляет прогресс выполнения задачи в таблице.

А клиент дергает простой скрипт, который проверяет по это таблице прогресс в процентах и выводит.

Я вам настоятельно рекомендую перед написанием своего велосипеда хотя бы ознакомиться с существующими способами решения.

Если бесплатный хостинг не позволяет запускать демоны, проще поменять его на нормальный VPS, а не изобретать неэффективные костыли.
Ответ написан
Ваш ответ на вопрос

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

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