2015年12月29日实习总结

关于生成sitemap的简单方法的介绍

这两天主要在做一个sitemap的生成的一个功能,其中涉及到一些文件操作和对xml文件的操作,以及一些基本的逻辑问题,在此记录一下。
什么是sitemap?
Sitemap 可方便网站管理员通知搜索引擎他们网站上有哪些可供抓取的网页。最简单的 Sitemap 形式,就是XML 文件,在其中列出网站中的网址以及关于每个网址的其他元数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度为何等),以便搜索引擎可以更加智能地抓取网站。(以上来自百度百科)。个人理解sitemap就是提供给百度爬虫的一些数据,以便百度搜索抓取你的想被抓取的页面。
sitemap文件格式和索引文件格式参考百度官方文档:http://zhanzhang.baidu.com/college/courseinfo?id=267&page=2#h2_article_title1&qq-pf-to=pcqq.c2c
下面就记录一下遇到的一些问题:
首先就是PHP的文件操作问题,由于之前几乎没有接触过文件操作,所以开始做的时候有些凌乱,后来对照文档,问题都顺利解决了。
这里主要记录一下文件的打开fopen()方法的第二个参数的问题,如果第二个参数为w的话,文件指针是在文件开头的,意思就是说,如果继续进行写操作的时候,会覆盖以前的数据(可以理解为重新写入数据),如果第二个参数为a的话,文件指针在文件末尾,会在文件末尾继续写入数据。这点还是需要注意一下的。
然后就是对xml的读写了,由于没有经验,所以一开始就按普通的文件操作进行,后来遇到了一个问题就是,我需要在原有的数据之中再插入数据。

我的xml文件格式如图
由于数据发生了变化,我需要把新的数据插入到该文件的箭头指向的位置。这样的话,如果像之前的单纯的文件操作的话,就比较麻烦了。后来从网上查了一下PHP对xml的操作,较之流行的有Xml Parse, XmlReader, Xml Rpc…我用的不是这些,而是一个已经集成于PHP环境中的simplexml。

$xml_obj = simplexml_load_file($this->sitemapPath.$conf['name']."_sitemap.xml"); //XML中的数据,读取到数组对象中
$xml_arr = $this -> object_to_array($xml_obj);

object_to_array()方法是自己写的一个将对象转化为数组的方法。这样就把xml的节点作为数组的一个元素用来处理(需要注意一点的是,xml文件中如果只有一个节点的话和有两个节点的数组的结构是不一样的,如果只有一个节点的话,数组会少一个维度)。

$totalSitemapArr = array();
if(!is_array($xml_arr['sitemap'][0])){
    $totalSitemapArr[] = $xml_arr['sitemap'];
}else{
    $totalSitemapArr = $xml_arr['sitemap'];
}

这是将数组格式化的代码,对上述不理解的话可以对照程序理解一下。

另外就是一些逻辑的处理了,包括我要做的功能是生成sitemap文件,限制每个文件最多不能超过2000条数据,如果超过2000条,需要写入另外一个文件中,当然也会有一个总的索引文件。主要逻辑就是关于总的索引文件和子文件的建立。
其中就包括了,该功能有两个方法,一个是全部重新生成所有的sitemap文件,还有一个是生成新添加的sitemap文件,类似于数据库的全备份和部分备份。这样就有一个比较有意思的问题:因为每个文件最多存2000条数据,所以部分更新的时候,会从最后一个文件的最后一条开始查找,并将该文件补全至2000条后再开始下一个文件的写入。
对于这个问题我的解决方法是:从最后一个文件的开头查找,找到以后的该条数据之后的数据(包括该条数据),然后重新写入这个文件。缺点就是会多执行0-2000条数据的写入,其实原理上来说并没有多执行这些操作,如果按照之前的逻辑,也需要把xml文件中的节点读出来,然后拼接新的数据并重新写入到原来的文件中,其实逻辑上的效率一样的,只是把IO操作替换成了数据库查询操作。

另:因为该文件需要定期执行,所以可以写入计划任务中。因为之前也没有接触过linux操作,只能请教cto了,具体方法,截图所示:
这里是添加计划任务的基本命令
这样就可以在晚上或是服务器空闲时自动执行生成sitemap文件的操作了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值