Как выполнять SOAP запросы в нескольких параллельных потоках?
Собственно имеется API одного из интернет-магазинов. Нужно посредством этого API через php SoapClient получить наличие и цену товаров на складах. Дело в том что это API позволяет получить только один товар за один раз, мне же нужно пройтись по >47К+ позиций номенклатуры. Один запрос может работать от 400мс. до 2-3 сек. Понятно что перебор всей номенклатуры займет гигантское время!
Можно ли как-то реализовать перебор этой номенклатуры в нескольких параллельных потоках (хотя бы в десяти).
Список артикулов для перебора хранится базе данных.
Предполагается запуск скрипта на сервере в командной строке.
Дело усугубляется тем, что нужно получать данные из еще двух площадок, один из них также работает на SOAP, другой можно реализовать на cUPL-ах (мультипоточно).
Многопотчность нужна для того чтобы максимально сократить время обновления данных о товарах (почти 200К позиций).
Сергей, ну во первых вы может запускать php файл несколько раз. Во вторых написать свою обертку над curl или которая будет работать с soap в несколько потоков. Как бы soap это обычный запрос к серверу.
Сергей, если вы их запустите параллельно то они будут работать параллельно. Как они будут вам сообщать - ну не знаю, ваш скрипт наверное можно договориться куда он положит сообщение о том что он все. Можете заморочиться и с помощью reactphp или swoole написать какой нибудь менеджер процессов. Можете класть задачи в бд или очередь и оттуда демонами или кроном разбирать. Вариантов миллиард.
Дикий xml это как? Какая разница что разбирать - xml, json, массив или свойства объекта?
Давайте оценим время для 1 потока. 47К позиций - это надо полагать 47 тыщ SOAP-requests надо сделать. Берем среднее время 400 ms до 3s это будет допустим 1700 ms.
47000 * 1700 ms = 79900s = 1331min = 22hours.
22 часа на 1-поточную загрузку товаров.
Из личного впечатления. SOAP - это не очень быстрый протокол. Хрен его закешируешь на н-жинкс. И я думаю что если его запускать в 2-4-8 потоков то ситуация может усугубиться. Если время прыгает в диапазоне от 400 мс до нескольких секунд то это значит что нагрузка в базе плавает сильно. И владелец этого SOAP-сервиса будет ой как не в востороге от ваших экспериментов. Вряд-ли он предполагал что кто-то будет делать массовые выгрузки.
Самый лучший вариант - предупредить его письменно об этой задаче и о том что вы собираетесь делать. Возможно он сообразит что дело пахнет DDOS-ом и сам предложит вам другой вариант выгрузки.
использовать php расширение parallel. если операция не разовая, то можно попробовать проверять по дате изменения страницы товара в sitemap.xml, чтобы не загружать все подряд.