Мультипоточность способов доставки

Основные моменты

Реализация основана на использовании библиотеки CURL. Если функции мультипоточных запросов CURL (curl_multi_*()) недоступны, запросы происходят в последовательном режиме. Если модуль шиппинга не поддерживает параллельность (текущая реализация FedEx, SwissPost), работа с этим сервисом также просходит в обычном, последовательном режиме. При этом никаких изменений в архитектуре модуля не требуется. При проверке настройки шиппинга используется доступный сервисом режим.

Реализация многопоточности и архитектура многопоточного модуля шиппинга

Управление сервисами осуществляется классом RealtimeServices.php.

Каждый сервис должен использовать интерфейс IService.php (app/Tygh/Shippings/IService.php).

И реализовывать следующие методы:

  • prepareData
  • processResponse
  • processErrors
  • allowMultithreading
  • getRequestData
  • getSimpleRates

Описание методов и входных параметров смотреть в файле ISerivce.php.

При возможности мультипоточности (сервер позволяет и позволяет сам сервис), будет вызван метод getRequestData, который должен вернуть массив следующего содержания:

return array(
    'method' => 'post', // post,get
    'url' => $url, // URL шиннинг сервиса, например: "https://wwwcie.ups.com:443/ups.app/xml/Rate"
    'data' => $request, // Данные, которые нужно отправить шиппинг сервису
    'headers' => array( // Не обязательный параметр. Дополнительные заголовки
        'Content-type: text/xml'
    )
);

После этого класс RealtimeServices добавит его в стек запросов. И выполнит их после обработки всех сервисов. После завершения запроса запустится callback метод processResponse, который должен вернуть массив:

$return = array(
    'cost' => false, // false - если не удалось получить цену или float число, например 3.45
    'error' => false, // false - если не было ошибок или string, если была. Например:
                      // "Destination zipcode is incorrect"
);

Если мультипоточность недоступна, то выполнится метод getSimpleRates. Обычно он так же выполняет getSimpleRates и запускает:

Http::post($data['url'], $data['data'], array('headers' => 'Content-type: text/xml'));

Должен вернуть ответ сервера. НЕ парсить его processResponse. Эта фукнция будет выполнена автоматически.

Тем самым, реализация мультипоточности происходит в классе RealtimeServices.