Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Параллельная отправка запросов к нескольким удаленным серверам
Форумы портала PHP.SU » » Работа с сетью » Параллельная отправка запросов к нескольким удаленным серверам

Страниц (1): [1]
 

1. roxoman - 20 Октября, 2015 - 21:25:42 - перейти к сообщению
Здравствуйте!

Суть работы приложения такова:
Клиент вводит в поиск артикул и нажимает "Найти". Сервер должен получить информацию о наличии товара с этим артикулом у поставщиков. Поставщиков может быть 2, а может быть 20. Каждый поставщик имеет свой API и разные способы общения - где-то SOAP, где-то JSON. На каких-то поставщиков уходит 0.5 секунды, на каких-то 1.5, но если этих поставщиков 20, то и поисковой выдачи пользователь ждет 20-30 секунд, то есть сейчас у нас работает простое последовательное получение данных от каждого поставщика.

Собственно вопрос: каким способом можно отправлять запросы сразу на несколько удаленных серверов параллельно?
2. Мелкий - 20 Октября, 2015 - 22:36:54 - перейти к сообщению
multi curl
3. roxoman - 11 Ноября, 2015 - 16:04:33 - перейти к сообщению
Мелкий пишет:
multi curl


Спасибо - это то, что нужно. Но разобрался только с JSON. Как быть с SOAP?
Как я понял, в случае с SOAP придется вручную строить XML-запрос и отдавать его в заголовках с помощью multicurl? Может, есть какой-то готовый класс для таких вещей? Я полдня разбираюсь, и у меня единственная проблема - как вручную построить этот XML-запрос (у каждого веб-сервиса же он разный).
4. Мелкий - 11 Ноября, 2015 - 16:25:29 - перейти к сообщению
Поковыряйте nuSOAP.

Кстати, может быть проще воспользоваться концепцией модных нынче микросерверов.
0) Сделайте своё универсальное API, с которым вам будет удобно работать.
1) Это апи опрашивайте мультикурлом
2) Сделайте для каждого стороннего API свой микропроект, который будет получать задание по вашему внутреннему api, и только этот микропроект будет знать и использовать реальное api этого стороннего проекта.
5. teddy - 11 Ноября, 2015 - 18:09:55 - перейти к сообщению
roxoman пишет:
как вручную построить этот XML-запрос (у каждого веб-сервиса же он разный)

Сначала просто обратитесь к этим сервисам через SoapClient, далее вызовите необходbмый метод, затем вызовите __getLastRequest() и получите нужный XML для запроса (не забываем выставить опцию trace в true).
Далее методом POST отправляйте этот XML(как тело POST запроса) тем же курлом туда, где живет WSDL службы. Не забудьте установить Content-Type как text/xml.
В ответ должен вернуться XML с данными, которые можно будет распарсить например с помощью simplexml

На сколько помню это всё, что нужно. Пробуйте
(Добавление)
Ну и конечно же в конце избавьтесь от SoapClient, раз уж отправляете сырые запросы Улыбка
6. roxoman - 04 Января, 2016 - 23:03:35 - перейти к сообщению
Мелкий пишет:
Поковыряйте nuSOAP.

Кстати, может быть проще воспользоваться концепцией модных нынче микросерверов.
0) Сделайте своё универсальное API, с которым вам будет удобно работать.
1) Это апи опрашивайте мультикурлом
2) Сделайте для каждого стороннего API свой микропроект, который будет получать задание по вашему внутреннему api, и только этот микропроект будет знать и использовать реальное api этого стороннего проекта.


teddy пишет:
roxoman пишет:
как вручную построить этот XML-запрос (у каждого веб-сервиса же он разный)

Сначала просто обратитесь к этим сервисам через SoapClient, далее вызовите необходbмый метод, затем вызовите __getLastRequest() и получите нужный XML для запроса (не забываем выставить опцию trace в true).
Далее методом POST отправляйте этот XML(как тело POST запроса) тем же курлом туда, где живет WSDL службы. Не забудьте установить Content-Type как text/xml.
В ответ должен вернуться XML с данными, которые можно будет распарсить например с помощью simplexml

На сколько помню это всё, что нужно. Пробуйте
(Добавление)
Ну и конечно же в конце избавьтесь от SoapClient, раз уж отправляете сырые запросы Улыбка



Нашел программку - SoapUI. Ей даешь ссылку на WSDL, а она возвращает XML, который необходимо отправить серверу. Каждый веб-сервис обошел с помощью нее - получил к каждому необходимые XML-шаблоны, в которые скрипт просто подставляет нужные данные. Не знаю, насколько это "костыльно", но работает отлично! Проверил на 15 одновременно подключенных веб-сервисах - было примерно 37-42 сек., стало 8-12, что вполне приемлимо для моей задачи.

 

Powered by ExBB FM 1.0 RC1