w_b_x
@w_b_x

Как использовать Guzzle из контроллера Symfony?

Здравствуйте, спасители!

Есть задача:
Отдавать контроллером результат из внешнего API.

Я установил бандл Guzzle для Symfony, чтобы сделать get-запрос - этот.

И у меня есть контроллер выполняющий эту задачу:
/**
     * @Route("/api/data")
     */
    public function getData()
    {
        $url = "http://127.0.0.1:8000/test_guzzle";
        $guzzle = $this->get('eight_points_guzzle.client.my_client');
        $result = $guzzle->request('GET', $url);
        return $this->json([$result]);
    }


Контроллер /test_guzzle выглядит так:
/**
     * @Route("/test_guzzle")
     */
    public function getThread(){
        return new Response("HELLO!!!");
 }


Но я получаю Exception:
cURL error 28: Operation timed out after 30000 milliseconds with 0 bytes received (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)


Не понимаю почему запрос не проходит.
Причём из браузера в инкогнито ссылка 127.0.0.1:8000/test_guzzle прекрасно открывается и показывает "HELLO!!!"

В чём может быть загвоздка?

Дополнение:
Изменил $url:
$url = "http://httpbin.org/get";
Код сработал идеально. Что это может быть? (тестирую сейчас и API и обращение на одном сервере, т.е url до первого контроллера выглядит так: 127.0.0.1:8000/api/data)
  • Вопрос задан
  • 890 просмотров
Пригласить эксперта
Ответы на вопрос 1
Matmode
@Matmode
PHP/Symfony Developer
w_b_x Проблема не в Guzzle.
Скорее всего Вы запустили сервер командой php app/console server:start . Эта команда использует встроенныей php-сервер. Он, согласно документации, может обрабатывать только один запрос за раз.

php.net/manual/ru/features.commandline.webserver.php
Веб-сервер выполняет только один однопоточный процесс, поэтому приложения PHP будут останавливаться, если запрос заблокирован.


В этом легко убедиться, если открыть одновременно следующие страницы
/**
     * @Route("/api", name="api")
     */
    public function apiAction()
    {
        sleep(10);

        return new Response('API page');
    }

    /**
     * @Route("/test", name="test")
     */
    public function testAction()
    {
        return new Response('Test page');
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы