【问题标题】:my site crawler died while it's running我的网站爬虫在运行时死了
【发布时间】:2011-06-27 12:53:09
【问题描述】:

我编写了一个站点爬虫来获取链接和图像以创建站点地图,但它在运行时被杀死了!所以这不是我的整个班级

class pageCrawler {

    .......

    private $links = array();

    public function __construct ( $url ) {

    ignore_user_abort ( true );
    set_time_limit ( 0 );
    register_shutdown_function ( array ( $this, 'callRegisteredShutdown' ) );
    $this->host = $urlParts [ 'host' ];
    $this->crawlingUrl ( $url );
    $this->doCrawlLinks ();

}

$this->crawlingUrl ( $url ): 在开始时设置此方法的主地址(例如http://www.mysite.com
getUrl():通过fsockopen连接到url然后获取url内容
findLinks():返回a hrefimg src然后存储返回链接在$this->links[] 然后我回显一些内容以刷新输出并在之后插入以下代码:

echo str_pad ( " ", 5000 );
flush ();

$this->doCrawlLinks(): 检查$this->links 并执行我在顶部为$this->links 的第一个元素描述的相同过程
然后移动第一个元素 再次 doCrawlLinks() 运行并获取第一个元素的 url 内容然后移动 $this->links 的第一个元素直到 $this->links 变空


这是我班的大势所趋,它是工作但突然它突然崩溃了。我将set_time_limit(0) 设置为永远执行,但我的过程未完成,因为我的喊叫功能未执行!我很困惑我的问题在哪里

【问题讨论】:

  • 您的错误报告功能是否开启?错误报告(E_ALL);以防它因为脚本的其余部分出错而超时?
  • "通过 fsockopen 连接到 url" - OMG!为什么??????
  • @symcbean : 我用过 CURL 但我又遇到了这个问题

标签: php web-crawler


【解决方案1】:

猜想 - 你在 doCrawlLinks() 中有递归吗?深度递归可以简单地使进程崩溃。或者它可能会因每个进程的内存限制而崩溃。

根据我的经验,将链接列表保留在数据库中并带有待处理/已处理标志非常有帮助,因此您可以随时关闭并恢复您的爬虫(或者在您的情况下 - 在崩溃后恢复它) .

【讨论】:

  • 我认为内存限制是我的问题,但有时在 3 或 4 次递归中它崩溃了!:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多