在多次运行说“无法建立连接”或“连接()超时”后,CURL 失败

Posted

技术标签:

【中文标题】在多次运行说“无法建立连接”或“连接()超时”后,CURL 失败【英文标题】:CURL fails after many runs saying "could not establish connection" or "connect() timed out" 【发布时间】:2012-05-16 21:06:53 【问题描述】:

我正在尝试为数百个网页编制索引。

简而言之

    使用 CRON 作业调用 php 脚本 获取一些(仅大约 15 个)最近最少更新的 URL 使用 CURL 查询这些 URL

问题

在开发中一切都很顺利。但是当我开始索引更多的测试页时,CURL 在一些运行后拒绝工作。它没有从远程服务器获取任何数据。

错误信息

CURL 已打印出这些错误(当然不是一次)

    无法连接到主机 操作在 60000 毫秒后超时,收到 0 个字节

我正在使用 V-Server 并尝试使用 Firefox 或 wget 连接到远程服务器。也没什么。但是,当从我的本地计算机连接到该远程服务器时,一切正常。

等待几个小时,它再次运行一些运行。

对我来说,这似乎是远程服务器的问题或 DDOS 保护或类似的问题,你们怎么看?

【问题讨论】:

也看看http错误码 失败时http状态码始终为0 通过 wget/FF 连接与从本地计算机连接是什么意思?有什么区别? 我的意思是如果 curl 停止工作,它不可能是 PHP 或 curl 的问题,因为我的整个 V-Server(不仅是 curl,还有 wget/FF)无法连接到远程服务器。 但是当使用我的本地浏览器浏览远程站点时,一切正常——这意味着远程服务器没有离线。在我的本地 apache 服务器上运行脚本也可以工作一段时间。有趣的是:在我看来(我还没有测量它!)在我的本地机器上遇到故障时,它确实需要更少的时间才能再次工作。 (编辑:不,这不可能是因为我的本地机器的IP同时改变了;我已经修复了IP) 【参考方案1】:

当您发送过多请求时,您应该使用代理,因为您的 IP 可能会被站点通过其 DDOS 保护或类似设置阻止。

这里有几点需要注意:(我用来抓取网站数据的)

1.使用代理。

2.使用随机用户代理

3.随机引用

4. crons 中的随机延迟。

5.请求之间的随机延迟。

我要做的是让脚本永远运行并在其间添加睡眠。

ignore_user_abort(1);
set_time_limit(0);

只需访问 url 几秒钟即可触发它,它将永远运行。

【讨论】:

【参考方案2】:

脚本多久运行一次?它真的可以触发一些类似 DOS 的保护。我建议实施一些随机延迟,使请求看起来延迟一段时间,使它们看起来更“自然”

【讨论】:

脚本每分钟运行一次,我已经改成5分钟了。每次运行它都会发送 5 到 20 个请求。 我实现了延迟:每个请求之间随机间隔 1 到 5 秒。你觉得是不是太少了? 看起来不错 - 每 5 分钟有 20 个请求应该没问题

以上是关于在多次运行说“无法建立连接”或“连接()超时”后,CURL 失败的主要内容,如果未能解决你的问题,请参考以下文章

grpc源码分析之域名解析

Django Python - 无法建立连接,因为目标机器主动拒绝它

升级 Knex 后出现“获取连接超时”

每次在 sqlmap 的同一步骤中出现“连接超时”错误

如何修复连接超时,cURL 错误 28?

pyInstaller 多次加载脚本