为什么对 Telegram Bot API 的 cURL 请求突然变得很慢?

Why cURL requests to Telegram Bot API suddenly became very slow?

我有几个 Telegram 机器人多年来一直运行良好;我使用了 2 种方式向 Bot 发送请求 API:

第一个是:

file_get_contents($url);

第二个是:

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_TIMEOUT => 60
]);
curl_exec($ch);

几天前我注意到:

  1. file_get_contents() 完全停止工作,每次都返回 failed to open stream: Connection timed out,但它可以很好地处理对其他网站的请求;
  2. cURL 继续工作,但速度很慢:在我向机器人发送消息后,我等待 5-8 秒才能收到答复;当我将 CURLOPT_CONNECTTIMEOUT 更改为 1 时,等待时间减少到 1 秒左右。

file_get_contents() 已经开始像以前一样使用这个 context:

file_get_contents($url, false, stream_context_create([
    'socket' => [
        'bindto' => '0:0'
    ]
]));

last_error_message 总是 Read timeout expired。服务器重新启动没有帮助。从浏览器直接向 Bot API 请求完美无缺。

发生了什么以及如何解决它?

这可能是因为 Curl 尝试反向 DNS 并且因为它只是等待超时而失败,您可以这样修复它:

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 )