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

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

简而言之

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

问题

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

错误信息

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

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

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

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

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

【问题讨论】:

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

标签: php curl timeout remote-server


【解决方案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 个请求应该没问题
    猜你喜欢
    • 2014-06-22
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 2015-07-17
    相关资源
    最近更新 更多