PHP Curl, похоже, блокирует ответ сервера, что приводит к тайм-аутуPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 PHP Curl, похоже, блокирует ответ сервера, что приводит к тайм-ауту

Сообщение Anonymous »

Я весь день гонялся за этим. У меня есть экземпляр Adobe Commerce (ранее Magento 2), работающий на сервере AWS. Я использую адаптер Curl Adobe Commerce для межсерверного вызова внешнего API. Обычно этот вызов выполняется без проблем и ответ обрабатывается правильно.

Код: Выделить всё

                $curl = $this->curlFactory->create();
$curl->setConfig(
[
CURLOPT_TIMEOUT => 30,
CURLOPT_USERAGENT => $this->getUserAgent(),
CURLOPT_SSL_VERIFYHOST => 0,
]
);
$curl->write('POST', $url, '1.1', $this->getHeaders($payload), $payload);
$curlResponse = $curl->read();

$statusCode = $curl->getInfo(CURLINFO_HTTP_CODE);
$headerLength = $curl->getInfo(CURLINFO_HEADER_SIZE);

$curl->close();
Однако я выявил случаи, когда чтение ответа от сервера приводило к ошибке тайм-аута. У меня есть доступ к серверу, который отправляет ответ, и я подтвердил, что он действительно отправляет ответ. И после использования tcpdump на клиентском сервере я убедился, что пакеты принимаются. Но вот в чем дело: пакеты не принимаются до тех пор, пока не истечет время ожидания функции $curl->read(). Похоже, что запрос $curl->read() блокирует входящие TCP-пакеты, и я не могу понять, почему.
Вот считывание соответствующих строк из tcpdump когда тайм-аут установлен на 30 секунд

Код: Выделить всё

22:21:10.658883 [redacted] Flags [.], ack 1506, win 497, length 0
22:21:41.091462 [redacted] Flags [P.], seq 4531:7193, ack 1506, win 501, length 2662
Обратите внимание на разрыв между пакетами почти ровно в 30 секунд. Когда я изменил таймаут на 20 секунд, я получил следующее:

Код: Выделить всё

22:23:26.620425 [redacted] Flags [.], ack 1506, win 497, length 0
22:23:46.340089 [redacted] Flags [P.], seq 1506:1530, ack 4531, win 457, length 24
Опять же, обратите внимание, что промежуток между пакетами составляет почти ровно 20 секунд. Просто ради интереса, вот что произошло, когда я установил тайм-аут на 17 секунд:

Код: Выделить всё

22:27:54.870698 [redacted] Flags [.], ack 1506, win 495, length 0
22:28:11.739022 [redacted] Flags [P.], seq 1506:1530, ack 4531, win 457, length 24
Бум! 17 секунд почти на носу.
Мне кажется, что пока адаптер Curl пытается прочитать ответ от сервера, он фактически блокирует получение ответа сервера. Это происходит не при каждом запросе. Это происходит с перерывами, но его можно воспроизвести после нескольких попыток.
Есть ли у кого-нибудь какие-нибудь советы о том, как решить эту проблему? Спасибо!
Я попытался отправить запрос на скручивание с помощью адаптера Curl Adobe Commerce. Я ожидал получить ответ от сервера. Вместо этого ответ от сервера задерживался до тех пор, пока не истечет время ожидания функции $curl->read(), а затем был получен немедленно.

Подробнее здесь: https://stackoverflow.com/questions/787 ... -a-timeout
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»