Существует ли максимум одновременного запроса localhost cUrl с PHP? - PullRequest
0 голосов
/ 18 октября 2019

Я настраиваю приложение vuejs и несколько приложений Laravel, которые должны взаимодействовать между ними. Связь между приложениями Laravel осуществляется через запрос cUrl. На данный момент все на моих машинах разработки (Last MacBook Pro - Mac OS Majove) с помощью MAMP Pro (PHP 7.3). Проблема в том, что когда я делаю одновременные запросы, у меня было:

CURL error 28 communication timeout ... with 0 bytes received.

Это если, конечно, не проблема тайм-аута (я пробовал с 2 минутами на всех приложениях и всех тайм-аутах - тот же результат). Поскольку я работаю с API, сеанса PHP нет (поэтому нет блокировки файла сеанса).

Кажется, что соединение cUrl закрыто, но я не знаю почему (я сам не закрываю его -и это не достигает тайм-аутов (подключение / чтение / глобальный)).

Более наглядно:


vuejs --ajax1--> Laravel A --cUrl--> Laravel B --cUrl--> Laravel C
vuejs --ajax2--> Laravel A --cUrl--> Laravel B --cUrl--> Laravel C

vuejs <--500-- Laravel A --X-- Laravel B <---- Laravel C
vuejs <--500-- Laravel A --X-- Laravel B <---- Laravel C

ajax1 and ajax2 are sent at the same time.

Работает, если ajax1 и ajax2 отправляются НЕ одновременно.

Что я знаю:

  • Связь прерывается между Laravel A и Laravel B, но Laravel B выполняет код и возвращает ответ (который так и не был получен, потому что, я думаю, соединение закрыто?). Но оба запроса удаляются Laravel C и Laravel C также выполняется.

Что я пробовал:

  • Apache и nginx
  • Отключить брандмауэр
  • Увеличение всех тайм-аутов (PHP - cUrl)
  • Увеличение лимита памяти (PHP)
  • cUrl CURLOPT_FORBID_REUSE и CURLOPT_FRESH_CONNECT options
  • Изменение имени локального домена и тдлприложений Laravel

Что мне интересно:

  • Существует ли максимальное количество запросов, которые я могу выполнить одновременно с помощью cUrl на одной и той же машине? конечно, установите CURLOPT_MAXCONNECTS на 20 - безуспешно)?
  • Есть ли конфигурация PHP.ini, которую я пропустил?
  • Возможно, проблема в том, что все эти приложениябегать на одной машине? Если да, то почему?
  • Оба сервера (nginx и Apache) ограничивают соединение с одного IP? (поскольку все приложения находятся на одном компьютере, все они имеют одинаковый IP-адрес).

1 Ответ

0 голосов
/ 04 ноября 2019

Просто столкнулся с той же проблемой. Где основной бэкэнд действует как прокси для получения данных из другого бэкэнда через curl (жадность).

Но я получаю тайм-аут, только если выполняю более 5 одновременных запросов. Все приложения работают, и я попытался настроить новый VPS-сервер, чтобы избежать всех бэкэндов на одной машине. Настройка CURLOPT_MAXCONNECTS также не работала.

Это мой поддельный прокси-код (с использованием laravel)

    $uri = $request->get('url');
    $api_url = env('URL');

    $token = env('TOKEN');
    $key = 'Bearer ' . $token;

    $client = new Client([
        'base_uri' => $api_url,
        'headers' => [
            'Accept' => 'application/json',
            'Content-Type' => 'application/json',
            'Authorization' => $key
        ]
    ]);

    $request = $client->request('GET', $uri, [
        'http_errors' => false
    ]);


    $response = $request->getBody()->getContents();

    return $response;

Я еще не нашел решения. Надеюсь, кто-то может помочь нам решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...