我写了一个网站抓取工具来获取链接和图片以创建网站地图,但它在运行时被杀死了!所以这不是我的全班
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 href
和img src
,然后在$this->links[]
中存储返回链接,然后我回显一些内容以刷新输出并在此之后插入以下代码:
echo str_pad ( " ", 5000 );
flush ();
$this->doCrawlLinks()
:
检查$this->links
并执行我在$this->links
的第一个元素的顶部描述的相同过程
然后转移第一个元素
再次doCrawlLinks()
运行并获取第一个元素的网址内容然后转移$this->links
的第一个元素,直到$this->links
变空
这是我班级的总体趋势,但突然间它突然崩溃了。我设置set_time_limit(0)
永远做,但我的过程没有完成因为我的shoutdoown功能剂量执行!我困惑我的问题在哪里
答案 0 :(得分:1)
狂野猜测 - 你在doCrawlLinks()中有一个递归吗?深度递归可以简单地崩溃过程。或者它可能因每个进程的内存限制而崩溃。
根据我的经验,将数据库中的链接列表与挂起/处理标志保持在一起是非常有帮助的,这样您就可以随时关闭并恢复您的爬虫(或者在您的情况下 - 在崩溃后恢复它)