Как в Yii2 осуществить запрос к Centrifugo?

Я использую Docker с подключенным Centrifugo. Когда я делаю запрос через Postman, все работает корректно. Вот пример запроса: 
<pre><code>curl --location 'http://localhost:8000/api' \
--header 'Authorization: apikey my_api_key' \
--header 'Content-Type: application/json' \
--data '{
    "method": "publish",
    "params": {
        "channel": "gnRvZBqyCyISSIIQyPdHxKOQkg_1SOuSABLUwWF0RbgeZDs_LSQNOnF-2_wpONqRTxyrkMwyzwMIZa4hew4vypU50gF0ZzW8BHA3",
        "data": {"type": "input-set-name", "uid": "onlineCurator"}
    }
}'</code></pre>
Я получаю ответ {}. Однако, когда пытаюсь сделать тот же запрос через Yii2, то сталкиваюсь с ошибкой:
<pre><code class="php">try {
                $client = new Client();
                $response = $client-&gt;createRequest()-&gt;setMethod('post');
                $response-&gt;addHeaders(['Authorization' =&gt; 'apikey ' . $this-&gt;apikey])
                    -&gt;setFormat(\yii\web\Response::FORMAT_JSON)
                    -&gt;setData($_data);
                $response-&gt;setUrl('http://localhost:8000/api');
                var_dump($response-&gt;send()); die();
            } catch (\Throwable $e) {
                var_dump($e); die();
            }</code></pre>
В этом случае получаю ошибку: fopen(<a href="http://localhost:8000/api" rel="nofollow">localhost:8000/api</a>): Failed to open stream: Connection refused. 
Можете помочь разобраться, в чем может быть проблема?
  • 23 ноября 2024 г. 14:13
Ответы на вопрос 2
Ошибки, которые вы видите, связаны с тем, что ваш запрос к Centrifugo через Yii2 не может быть выполнен из-за проблем с соединением. Давайте разберем несколько возможных причин и решений.

### Возможные причины проблемы

1. **Проблемы с Docker**: Если ваш Yii2-приложение и Centrifugo работают в разных контейнерах, `localhost` внутри контейнера приложения не будет ссылаться на ваш хост. Вместо этого вам нужно использовать имя сервиса или IP-адрес, по которому доступен Centrifugo из контейнера с Yii2.

2. **Проблемы с конфигурацией сервиса**: Убедитесь, что у Centrifugo есть открытый порт и он принимает соединения от вашего Yii2-приложения.

3. **Настройки сети**: Если вы используете Docker Compose, проверьте, правильно ли настроены сети, которые могут позволить контейнерам общаться друг с другом.

### Как это исправить

1. **Используйте имя сервиса или IP-адрес**: Если вы используете Docker Compose, замените `localhost` на имя сервиса Centrifugo. Например, если у вас есть следующий `docker-compose.yml`:
   ```yaml
   services:
     centrifugo:
       image: centrifugo/centrifugo
       ports:
         - "8000:8000"

     yii2_app:
       build: .
       depends_on:
         - centrifugo
   ```

   Тогда вам нужно использовать `centrifugo:8000` вместо `localhost:8000` в вашем Yii2 коде.

2. **Измените Yii2 код для корректной отправки запроса**:
   ```php
   use yii\httpclient\Client;

   try {
       $client = new Client();
       $response = $client->createRequest()
           ->setMethod('post')
           ->addHeaders(['Authorization' => 'apikey ' . $this->apikey])
           ->setFormat('application/json')  // Установите нужный формат, если требуется
           ->setData([
               'method' => 'publish',
               'params' => [
                   'channel' => 'gnRvZBqyCyISSIIQyPdHxKOQkg_1SOuSABLUwWF0RbgeZDs_LSQNOnF-2_wpONqRTxyrkMwyzwMIZa4hew4vypU50gF0ZzW8BHA3',
                   'data' => ['type' => 'input-set-name', 'uid' => 'onlineCurator']
               ]
           ])
           ->setUrl('http://centrifugo:8000/api'); // замените localhost на имя сервиса

       $result = $response->send();

       var_dump($result->data); // выводим ответ
       die();
   } catch (\Throwable $e) {
       var_dump($e); 
       die();
   }
   ```

3. **Проверка статуса**: Убедитесь, что Centrifugo работает и слушает на правильном порту. Вы можете проверить это с помощью `curl` или `Postman` по адресу `http://centrifugo:8000/api` из другого контейнера.

### Заключение
Если после всех этих изменений проблема все еще сохраняется, убедитесь, что Centrifugo действительно принимает запросы. Для этого проверьте его логи и настройки.
Нашел решение. Во первых я в docker-compose объединил network все контейнеры, что у них была одна сеть и я мог обращаться к соседней сети 

Дальше я вместо url localhost:8000/api поменял на название контейнера и получился адрес centrifugo:8000/api . И все теперь заработало
Похожие вопросы