Привет.
В одном из моих проектов клиент загружает .csv файл, который необходимо пропарсить. Занимает это приличное количество времени, поэтому существует необходимость в отображении прогрессбара.
Решил сделать так:
1. Клиент загружает файл, он сохраняется, его название пишется в сессию.
2. Открывается страница ожидания. Идет асинхронный AJAX-запрос на сам парсинг (который долго висит), далее каждые несколько секунд идут запросы на проверку статуса. Статус пишется в сессию той медленной функцией, а по запросу на проверку — просто возвращается информация из сессии.
Проблема в следующем: когда парсинг начинается, зависает не только первый запрос, но и вообще любые скрипты. Соответственно ни на статус, ни на любой другой скрипт захода нет — висит вечная загрузка. Как только парсинг заканчивается — все опять начинает работать.
Пробовал решить проблему через pcntl_fork(), но безрезультатно — получается так, что первый скрипт мгновенно завершает работу, но при загрузке другого скрипта все то же самое — нет ответа пока парсинг не закончится.
Что можно сделать в данной ситуации? Не хотелось бы прикручивать крон из-за долгого ожидания парсинга (даже если раз в минуту — парсинг может занимать секунд 40, не хотелось бы тратить время). Спасибо.
+ за gearman. Один раз подняли у себя для одной штуки (как из пушки по воробьям), зато когда проект разростался - тут и ощутили всю прелесть очередей. Теперь если что-то долго думающее от PHP надо - создал воркер, послал ему задание и ни о чем не думай.
+++++ за gearman :) Использую во внутреннем сервисе рассылок. Там базы по 3 - 6 000 подписчиков в каждом списке. Еще один + этой штуки - это возможность в реальном времени отслеживать выполнение задания. Так например я могу отслеживать в реальном времени сколько писем отправлено и сколько из них уе прочитаны.
Ваш "медленный" скрипт блокирует сессию и не дает прочитать из нее прогресс. Нужно либо постоянно открывать/закрывать сессию, либо хранить данные где-то еще.
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.
Загрузку можно с прогресс баром таким образом организовать www.uploadify.com
Что касается парсинга, php Вам не вернет ответ, пока скрипт не завершит работу, можете просто фейковый прогресс организовать для видимости