在多次运行说“无法建立连接”或“连接()超时”后,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 失败的主要内容,如果未能解决你的问题,请参考以下文章