Http клиент для запросов на сторонние сайты.
Данный компонент предусмотрен для Yii2 advanced.
При необходимости можете переделать и под basic (особого труда не составит).

Код:

<?php

namespace common\components;


class HttpClient
{
    /** @var bool Сохранять ли заголовки ответа */
    protected $isSaveHeaders = false;
    /** @var array Массив заголовков ответа */
    protected $responseHeaders = [];


    /**
     * Отправка POST-запроса
     * @param string $url
     * @param array|string $params
     * @param array $headers Формат см. CURLOPT_HTTPHEADER
     * @return string|mixed
     */
    public function post($url, $params, array $headers = [])
    {
        $ch = $this->initCurl($url, $headers, $params);

        return curl_exec($ch);
    }

    /**
     * Отправляет post запрос с помощью multi curl
     *
     * @param string $url
     * @param array $params
     * @param array $headers
     *
     * @return array
     */
    public function postMultiExec(string $url, array $params, array $headers = []): array
    {
        $multiCurl = [];
        $result = [];
        $mh = curl_multi_init();
        foreach ($params as $i => $data) {
            $multiCurl[$i] = $this->initCurl($url, $headers, json_encode($data));
            curl_multi_add_handle($mh, $multiCurl[$i]);
        }

        $index = null;
        do {
            curl_multi_exec($mh, $index);
        } while ($index > 0);

        foreach ($multiCurl as $k => $ch) {
            $result[$k] = curl_multi_getcontent($ch);
            curl_multi_remove_handle($mh, $ch);
        }

        curl_multi_close($mh);

        return $result;
    }

    /**
     * @param string $url
     * @param array $headers
     * @param array $data
     *
     * @return resource
     */
    protected function initCurl($url, array $headers = [], $data = null)
    {
        $ch = curl_init();

        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_AUTOREFERER => true,
            CURLOPT_HEADER => false,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false
        ]);

        if ($this->isSaveHeaders) {
            $this->responseHeaders = [];
            curl_setopt($ch, CURLOPT_HEADERFUNCTION, [$this, 'headerLineHandler']);
        }

        if ($data !== null) {
            curl_setopt_array($ch, [
                CURLOPT_POST => true,
                CURLOPT_POSTFIELDS => $data
            ]);
        }

        return $ch;
    }

    /**
     * Отправка GET-запроса
     * @param string $url
     * @param array $headers
     * @return string|mixed
     */
    public function get($url, array $headers = [])
    {
        $ch = $this->initCurl($url, $headers);

        return curl_exec($ch);
    }

    /**
     * Обработка и сохранение заголовков ответа curl (см. CURLOPT_HEADERFUNCTION)
     * @param resource $ch
     * @param string $headerLine
     * @return int
     */
    private function headerLineHandler($ch, $headerLine)
    {
        if (($separatorPos = strpos($headerLine, ':')) !== false) {
            $name = strtolower(trim(substr($headerLine, 0, $separatorPos)));
            $value = trim(substr($headerLine, $separatorPos + 1));
            $this->responseHeaders[$name] = $value;
        }
        return strlen($headerLine);
    }

    /**
     * @return array
     */
    public function getResponseHeaders()
    {
        return $this->responseHeaders;
    }

    /**
     * @param bool $isSaveHeaders
     * @return $this
     */
    public function setIsSaveHeaders($isSaveHeaders)
    {
        $this->isSaveHeaders = $isSaveHeaders;
        return $this;
    }
}