PHP: Как запустить обработку в фоне?

Привет.
В одном из моих проектов клиент загружает .csv файл, который необходимо пропарсить. Занимает это приличное количество времени, поэтому существует необходимость в отображении прогрессбара.

Решил сделать так:
1. Клиент загружает файл, он сохраняется, его название пишется в сессию.
2. Открывается страница ожидания. Идет асинхронный AJAX-запрос на сам парсинг (который долго висит), далее каждые несколько секунд идут запросы на проверку статуса. Статус пишется в сессию той медленной функцией, а по запросу на проверку — просто возвращается информация из сессии.

Проблема в следующем: когда парсинг начинается, зависает не только первый запрос, но и вообще любые скрипты. Соответственно ни на статус, ни на любой другой скрипт захода нет — висит вечная загрузка. Как только парсинг заканчивается — все опять начинает работать.

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

Что можно сделать в данной ситуации? Не хотелось бы прикручивать крон из-за долгого ожидания парсинга (даже если раз в минуту — парсинг может занимать секунд 40, не хотелось бы тратить время). Спасибо.
  • Вопрос задан
  • 2781 просмотр
Решения вопроса 1
Используйте сервер очередей (например, gearman).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@neol
Ваш "медленный" скрипт блокирует сессию и не дает прочитать из нее прогресс. Нужно либо постоянно открывать/закрывать сессию, либо хранить данные где-то еще.

Session data is usually stored after your script terminated without the need to call session_write_close(), but as session data is locked to prevent concurrent writes only one script may operate on a session at any time.


php.net//manual/ru/function.session-write-close.php
Ответ написан
Комментировать
shcherbanich
@shcherbanich
Программист
Загрузку можно с прогресс баром таким образом организовать www.uploadify.com
Что касается парсинга, php Вам не вернет ответ, пока скрипт не завершит работу, можете просто фейковый прогресс организовать для видимости
Ответ написан
Ваш ответ на вопрос

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

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