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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Параллельная отправка запросов к нескольким удаленным серверам

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
roxoman
Отправлено: 20 Октября, 2015 - 21:25:42
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




Здравствуйте!

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

Собственно вопрос: каким способом можно отправлять запросы сразу на несколько удаленных серверов параллельно?
 
 Top
Мелкий Супермодератор
Отправлено: 20 Октября, 2015 - 22:36:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




multi curl


-----
PostgreSQL DBA
 
 Top
roxoman
Отправлено: 11 Ноября, 2015 - 16:04:33
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




Мелкий пишет:
multi curl


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



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Поковыряйте nuSOAP.

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


-----
PostgreSQL DBA
 
 Top
teddy
Отправлено: 11 Ноября, 2015 - 18:09:55
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




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

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

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


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




Мелкий пишет:
Поковыряйте 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, что вполне приемлимо для моей задачи.

(Отредактировано автором: 04 Января, 2016 - 23:06:11)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с сетью »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB