Решение для реализации обработки файла по частям (например, для импорта)?
Необходимо сделать импорт записей для сайта. Импорт будет или с помощью XML, или CSV.
Проблема в том, что обрабатывать большой файл долго и скрипт оборвется либо по времени работы PHP, либо пользователь может ненароком закрыть страницу, на которой идет обработка.
Хочется сделать, чтобы PHP обрабатывал сначала одну строку, потом возвращал сообщение об успехе, а с клиента приходил запрос на обработку следующей строки.
Соответственно на основе этого сделаю и прогресс-бар, и процент выполнения. Тогда можно будет видеть, какое количество строк обработано, соответственно обрабатываться может файл любого размера.
Интересует, есть ли с одной стороны простое, с другой стороны универсальное решение такой задачи?
Можно файл залить целиком на сервер с формой, отображающей процент загрузки (делается через APC).
В скрипте снять ограничение на время исполнения через set_time_limit(0);
А продолжить работу после закрытия браузера через ignore_user_abort(true);
Читать файл построчно, чтобы не забивать всю оперативку и выполнять SQL INSERT на каждой строке.
За процессом обработки можно следить через создание дополнительной таблицы, куда будет записываться идентификатор загрузки, количество строк в файле, количество обработанных строк. И на отдельной странице следить за ходом выполнения.
Для увеличения скорости рекомендуется делать INSERT не по одной строчке, а хотя бы по 100.
Другой вариант это чтение файла через JavaScript и HTML5, отправка по строчке на сервер, где выполняется INSERT и отправляется подтверждение на клиент.
Но работать это будет медленнее и нельзя закрывать браузер.
Потискайте поиск, это весьма частый случай.
Как правило, Обработчик оставляют работать в фоне, и заставляют где-то хранить «текущую строку». Например, в мемкеше.
А ваш скрипт с прогрессбаром смотрит в мемкеш и отдает клиенту циферку.
Как-то так.
Ну и не забыть запустить обработчик после импорта файла. =) кто-то пользуется fork, кто-то очередями задач. Кому как удобнее.
Вы занимаетесь ерундой. Для сложных задач организуются т.н. очереди задач, то есть файл загружается на сервер, добавляется в очередь задача (обработать файл), пинается демон, скрипт на этом завершается, показывает сообщение «ждите», а в то же время демон видит новую задачу, запускает скрипт обработки, периодически обновляет прогресс выполнения задачи в таблице.
А клиент дергает простой скрипт, который проверяет по это таблице прогресс в процентах и выводит.
Я вам настоятельно рекомендую перед написанием своего велосипеда хотя бы ознакомиться с существующими способами решения.
Если бесплатный хостинг не позволяет запускать демоны, проще поменять его на нормальный VPS, а не изобретать неэффективные костыли.
Это решение больше для простых задач, при которых стоит вопрос, делать ли заполнение вручную или написать простенький импорт. И уж явно ради такой задачи никто переезжать не соберется.
Например, клиент создал на сервере папку «Каталог товаров» и загрузил туда 50 картинок. Папку-то переименуем в «catalog». Нужно просто пройти по страницам сайта и поменять ссылки на картинки с "/Каталог товаров/image_09.jpg" на "/catalog/image_09.jpg". А страниц всего-то около сотни.