3

我有几个 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 发出请求非常有效。

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

4

1 回答 1

1

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

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 )

于 2019-08-16T13:43:20.913 回答