sslion
@sslion

Как выполнять SOAP запросы в нескольких параллельных потоках?

Собственно имеется API одного из интернет-магазинов. Нужно посредством этого API через php SoapClient получить наличие и цену товаров на складах. Дело в том что это API позволяет получить только один товар за один раз, мне же нужно пройтись по >47К+ позиций номенклатуры. Один запрос может работать от 400мс. до 2-3 сек. Понятно что перебор всей номенклатуры займет гигантское время!
Можно ли как-то реализовать перебор этой номенклатуры в нескольких параллельных потоках (хотя бы в десяти).
Список артикулов для перебора хранится базе данных.
Предполагается запуск скрипта на сервере в командной строке.
Дело усугубляется тем, что нужно получать данные из еще двух площадок, один из них также работает на SOAP, другой можно реализовать на cUPL-ах (мультипоточно).
Многопотчность нужна для того чтобы максимально сократить время обновления данных о товарах (почти 200К позиций).
  • Вопрос задан
  • 85 просмотров
Пригласить эксперта
Ответы на вопрос 3
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
Если SOAP запрос не удастся сделать через Curl, сделав все заголовки ручками, то установите "composer require react/async".

<?php

$loop = Loop::get();

$limitThreads = 3;

$soaps = [
  // ...
];

$tasks = [];

$limit = $limitThreads;
while ($limit--) {
   $soap = array_shift($soaps);

   $tasks[] = function () use ($soap) {
     // do soap request...
     return $result = doSoapRequest($soap);
   };
}

if ($tasks) {
  $results = await(parallel($tasks));

  foreach ($results as $result) {
    var_dump($result);
  }
}

$loop->run();
Ответ написан
Комментировать
@mayton2019
Bigdata Engineer
Давайте оценим время для 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-ом и сам предложит вам другой вариант выгрузки.
Ответ написан
Комментировать
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
использовать php расширение parallel. если операция не разовая, то можно попробовать проверять по дате изменения страницы товара в sitemap.xml, чтобы не загружать все подряд.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы