PHP Curl 似乎阻止服务器响应导致超时

问题描述 投票:0回答:1

我一整天都在追这个问题。我有一个在 AWS 服务器上运行的 Adobe Commerce(以前称为 Magento 2)实例。我正在使用 Adobe Commerce 的 Curl 适配器对外部 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 数据包,但我不明白为什么。

这里是超时设置为 30 秒时从 tcpdump 读取的相关行

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 适配器试图读取服务器的响应,但它实际上阻止了服务器接收响应。并非每个请求都会发生这种情况。它是间歇性的,但经过几次尝试也可以复制。

有人对如何解决这个问题有任何建议吗?谢谢!

我尝试使用 Adobe Commerce 的 Curl 适配器发送curl 请求。我期望收到服务器的响应。相反,来自服务器的响应会被延迟,直到

$curl->read()
函数超时,然后立即收到。

php curl networking magento tcp
1个回答
0
投票

您是否尝试过使用简单的 CURL 函数来执行 POST 请求?

例如,

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt(
    $ch, 
    CURLOPT_HTTPHEADER, 
    $this->getHeaders($payload),
);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($payload));

// Receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);

curl_close($ch);
© www.soinside.com 2019 - 2024. All rights reserved.