| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > 504 gateway time-out |
| Автор: studentigor 17.10.2012, 09:16 |
| Всем привет. Есть парсер. Он по имеющимся логину и паролю авторизируется на неком сайте, и с личного кабинета авторизированого пользователя парсит некие данные. Данных можнт быть мало, а может быть и много. Механиз такой. Аякс шлет запрос на сервер, он запускает парсер, он начинает работать. Сначала парсит и расфасовывает все по меделям, потом все скопом встявляет в базу, и в качастве ответа возвращает колличество спаршеных записей. Так вот, если записей немного, парсер отрабатывает и все нормально возвращается. Но если их оч много, то происходит следующее. Послался аякс запрос, парсер начал работать, через время он возвращает на аякс ответ "504 gateway time-out" - ошибка, нужное число спаршеных записей не получена, при этом сам парсер продолжает работать дальше, и в итоге дорабатывает до конца. Я на локале, в настройку аякса запихнул время ожидания ответа от сервера - 10 минут(чтобы наверняка). С таким раскладом все нормально отработало и в аякс я получил нужный мне ответ. Но вот на хостинге этот таймаут ожидания ответа игнорится, ну и само собой я постоянно полачай 504 ошибку. На хосте врятли мне позволят увеличить время ожидания ответа, т.к. это небезопасно. Подскажите как можно решить такую задачку |
| Автор: Aliance 17.10.2012, 09:58 |
| Ну если выдумывать костыли - например парсить в кроне и заносить результат в мемкеш, а при аякс обращении выдавать закешированные данные. Хотя проще сменить тайм аут, а при отказе в этом, сменить хостинг. |
| Автор: studentigor 17.10.2012, 10:20 |
| Aliance, тат даже дело не в том что хост не разрешит это сделать, тут ещё огромную роль играет заказчик. А он заморочен по поводу производительности, потому что они походу за нормальный хост не хотят платить лаве, а сидят на слабеньком, там ограничено по оперативе, по дисковому пространству, и тд. И врятли его интересует то что возникла такая загвоздка. По поводу парсинга - есть крон, я правда не знаю как он там отрабатывает, но тут по мимо крона ещё есть возможность запустить эти парсеры и пользователем вручнут. Вот он захотел обновить. берет и запускает обновление - тоесть его кабинет на какомто сайте начинает парсится, и ему возвращается количество спаршеных(новых и обновленных) записей. Поэтуму нужен какойнить костиль, для начала для js->ajax->php->ajax->js Какие ещё можно варианты придумать? |
| Автор: studentigor 17.10.2012, 11:17 |
| В общем то, мож кому пригодится. Когда я с аякса шлю запрос на запуск парсера, - я тупо его запускаю, и отвечаю что-то типа парсер запущен. парсер начинает работать независимо, и когда он закончит работать сохраняю результат в сессию, если не отработал - всеравно в сесию записываю что не отработал. В джаваскрипте, одновренно с работой парсера, после того как сделал запуск парсеров через аякс, я начинаю с какой нить периодичностью аяксом запрашивать сервак на наличие в сесси данных о работе парсеров, о как только в сессии эти данные появятся, я отдам их на очередной запрос, и если данные вернутся - запросы прекратятся и я просто выведу результат. вобщем то Aliance наполовину дал решение. Спасибо! |
| Автор: Sanchezzz 17.10.2012, 11:21 | ||
Костыль с аяксом не решит ваши проблемы вам нужно переделывать сам крон парсер на порции это 100% без отказное решение проблемы. Начните с крона + со всего остального написанного кода может есть что оптимизировать чем вбивать очередной костыль. |
| Автор: studentigor 17.10.2012, 11:27 |
| Sanchezzz - я не взлом имел ввиду. А про то что мало ли какой конфуз может получится, это действительно может привести к неоправданым ресурсо затратам. Я когда описывал проблему, то парсер отрабатывает до конца, просто js недожидается ответа. |
| Автор: Sanchezzz 17.10.2012, 11:31 |
| покажите код JS возможно есть узкие места |
| Автор: studentigor 30.10.2012, 14:20 | ||
была мысль создавать паралельный поток, в котором бы работал парсер, и в конце работы запихнул данные в бд. После того как в одном потеке запустился парсер, второй возвращает ответ в js. В js Я получил ответ, типо парсер запустился, открываю попап окно, и начинаю с каким нить таймаутом бегать на сервер и смотреть, появилась ли нужная запись в бд, если нет, отправляю назад ответ, что ничего нету, а в js смотрю, если ничего нету, то через такойже таймаут опять шлю запрос, пока не получу ответ что в базе что-то есть. Как только чето появилось, вывожу в попап результат, и останавливаю запросы. то что проверяю по бд - это так, для примера. Но такой подход затратный по ресурсам. При создании паралельного потока в 2 раза увеличивается нужда в оперативе, поэтому пока ведутся переговоры. |