Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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 возможно есть узкие места

Автор: Aliance 17.10.2012, 11:51
Цитата(studentigor @  17.10.2012,  12:17 Найти цитируемый пост)
Когда я с аякса шлю запрос на запуск парсера, - я тупо его запускаю, и отвечаю что-то типа парсер запущен.

Эм, а как вы хотите вернуть ответ, не дождавшись выполнения работы парсера?

Автор: studentigor 30.10.2012, 14:20
Цитата

а как вы хотите вернуть ответ, не дождавшись выполнения работы парсера? 


была мысль создавать паралельный поток, в котором бы работал парсер, и в конце работы запихнул данные в бд.
После того как в одном потеке запустился парсер, второй возвращает ответ в js.

В js Я получил ответ, типо парсер запустился, открываю попап окно, и начинаю с каким нить таймаутом бегать на сервер и смотреть, появилась ли нужная запись в бд, если нет, 
отправляю назад ответ, что ничего нету, а в js смотрю, если ничего нету, то через такойже таймаут опять шлю запрос, пока не получу ответ что в базе что-то есть.
Как только чето появилось, вывожу в попап результат, и останавливаю запросы.

то что проверяю по бд - это так, для примера.

Но такой подход затратный по ресурсам. При создании паралельного потока в 2 раза увеличивается нужда в оперативе, поэтому пока ведутся переговоры.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)