实现流程
- 按照百度文档生成指定格式文件
- 写入文件到自己项目路径下
- 写定时脚本抓取新URL到项目路径下
- 注意:涉及多台服务器的情况:用rsync(linux),同步数据
流程代码
(1) 生成sitemap XML
<?php
/**
* @desc 百度Sitemap生成类
* @author 王中阳
* @version 2016-11-23
* @copyright 麦芽田
*/
class Tool_BaiduSitemap
{
/**
* 生成sitemap内容
* todo 新特性 移动sitemap 参数3
* @param array $sitemapInfo
* 参数1:loc,该页的网址。该值必须少于256个字节(必填项)。
* 参数2:lastmod,该文件上次修改的日期(选填项)。格式为年-月-日
* 参数3:百度新增移动sitemap 自适应(M PC) PC 需要区分
* 参数4:changefreq,页面可能发生更改的频率(选填项)。有效值为:always、hourly、daily、weekly、monthly、yearly、never。
* 参数5:priority,此网页的优先级。有效值范围从 0.0 到 1.0(选填项)。0.0优先级最低、1.0最高。
* 注意:urlset需要配置xmlns:mobile="http://www.baidu.com/schemas/sitemap-mobile/1/ 一定要加
* @return string
*/
public static function createSitemapContents(array $sitemapInfo)
{
$sitemapContent = '';
if (!empty($sitemapInfo) && is_array($sitemapInfo)) {
$sitemapContent .= '<?xml version="1.0" encoding="UTF-8"?>';
$sitemapContent .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:mobile="http://www.baidu.com/schemas/sitemap-mobile/1/">';
foreach ($sitemapInfo as $key => $value) {
$sitemapContent .= '<url>';
$sitemapContent .= "<loc>{$value['url']}</loc>";
$sitemapContent .= "<mobile:mobile type=\\"mobile\\"/>";
$sitemapContent .= "<lastmod>{$value['lastmod']}</lastmod>";
$sitemapContent .= "<changefreq>{$value['changefreq']}</changefreq>";
$sitemapContent .= "<priority>{$value['priority']}</priority>";
$sitemapContent .= '</url>';
unset($sitemapInfo[$key], $key, $value);
}
$sitemapContent .= '</urlset>';
}
return $sitemapContent;
}
/**
* 生成sitemap索引内容
* @param array $sitemapIndexInfo
* 参数1:loc,该页的网址。该值必须少于256个字节(必填项)。
* 参数2:lastmod,该文件上次修改的日期(选填项)。格式为年-月-日
* @return string
*/
public static function createSitemapIndexContents(array $sitemapIndexInfo)
{
$sitemapIndexContent = '';
if (!empty($sitemapIndexInfo) && is_array($sitemapIndexInfo)) {
$sitemapIndexContent .= '<sitemapindex>';
foreach ($sitemapIndexInfo as $key => $value) {
$sitemapIndexContent .= '<sitemap>';
$sitemapIndexContent .= "<loc>{$value['url']}</loc>";
$sitemapIndexContent .= "<lastmod>{$value['lastmod']}</lastmod>";
$sitemapIndexContent .= '</sitemap>';
unset($sitemapIndexInfo[$key], $key, $value);
}
$sitemapIndexContent .= '</sitemapindex>';
}
return $sitemapIndexContent;
}
}
(2) Sitemap Controller 结合自身逻辑,拼URL
<?php
include '../include/AutoRun.php';
include '../include/BaiduSitemap.php';
include '../include/Utils.php';
include '../include/MongoTool.php';
class Sitemap
{
const LIMIT_NUM = 40000;
const FILE_DIR = 'xml存储路径';
const DOMAIN_HOME_URL = ' ';
private $sitemapFilesInfo = array();
public function __construct()
{
}
public function createSitemap()
{
//单页URL
$sitemapInfo = $this->getSinglePageURLs('home');
$this->createBaiduSitemap('single', $sitemapInfo, 'home');
//详情列表
$sitemapInfo = $this->getArticlePageURLs();
$this->createBaiduSitemap('article', $sitemapInfo, 'article');
// sitemapIndex是区别于xml的另一种提交方式
$this->createBaiduSitemapIndex();
}
/**
* 获取所有单页面的URL地址,例如首页
*/
private function getSinglePageURLs($type)
{
$sitemapInfo = array();
$singlePage = array(
'home' => array('' => '1.0', 'hot/' => '0.8', 'city/' => '0.6', 'price/' => '0.6', 'news/' => '0.6', 'guide/' => '0.6', 'reviews/' => '0.6'), //首页 行情列
);
foreach ($singlePage[$type] as $pageUrl => $priority) {
$sitemapInfo[] = $this->getSitemapInfo($pageUrl, $priority, $type);
}
return $sitemapInfo;
}
private function getSitemapInfo($url, $priority, $type)
{
$preUrl = self::DOMAIN_HOME_URL;
$freq = 'always';
return array(
'url' => $preUrl . $url,
'lastmod' => date('Y-m-d'),
'changefreq' => $freq,
'priority' => $priority
);
}
/**
* 获取所有文章页面的URL
*/
private function getArticlePageURLs()
{
$mongo = MongoTool::getDB('content', true)->selectCollection('article_info');
$sitemapInfo = array();
$data = $mongo->find();
foreach ($data as $key => $value) {
$url = $this->getArticleUrl($value);
$sitemapInfo[] = $this->getSitemapInfo($url, '0.3', "article"); //文章页
}
return $sitemapInfo;
}
/**
* 创建百度Sitemap文件
*/
private function createBaiduSitemapFile($sitemapContents, $filePath)
{
if (!empty($sitemapContents) && !empty($filePath)) {
// 创建文件
file_put_contents(self::FILE_DIR . $filePath, $sitemapContents);
// 为SitemapIndex文件记录生成过哪些Sitemap文件
$this->sitemapFilesInfo[] = array(
'url' => self::DOMAIN_HOME_URL . $filePath,
'lastmod' => date('Y-m-d'),
);
}
}
/**
* 创建百度Sitemap索引文件
*/
private function createBaiduSitemapIndexFile($sitemapIndexContents, $filePath)
{
if (!empty($sitemapIndexContents) && !empty($filePath)) {
// 创建文件
file_put_contents(self::FILE_DIR . $filePath, $sitemapIndexContents);
}
}
/**
* 创建百度Sitemap
*/
private function createBaiduSitemap($fileName, array $sitemapInfo, $save = 'all')
{
if (!empty($sitemapInfo) && is_array($sitemapInfo)) {
$total = count($sitemapInfo);
$pages = ceil($total / self::LIMIT_NUM);
for ($i = 1; $i <= $pages; $i++) {
$offset = self::LIMIT_NUM * ($i - 1);
$partSitemapInfo = array_slice($sitemapInfo, $offset, self::LIMIT_NUM);
$sitemapContents = Tool_BaiduSitemap::createSitemapContents($partSitemapInfo);
unset($partSitemapInfo);
$filePath = "m_{$fileName}_{$i}.xml";
$this->createBaiduSitemapFile($sitemapContents, $filePath);
}
unset($sitemapInfo);
}
}
/**
* 创建百度SitemapIndex
*/
private function createBaiduSitemapIndex()
{
// 拆分成2个方法是为了可以进一步处理哪些类型的页面需要生成到SitemapIndex文件中
$sitemapFilesInfo = $this->sitemapFilesInfo;
$pcSitemapFilesIndexInfo = $mSitemapFilesIndexInfo = array();
if (!empty($sitemapFilesInfo) && is_array($sitemapFilesInfo)) {
foreach ($sitemapFilesInfo as $info) {
if (!stripos($info['url'], 'm.')) {
$pcSitemapFilesIndexInfo[] = $info;
} else {
$mSitemapFilesIndexInfo[] = $info;
}
}
// $this->createBaiduSitemapIndexFile(Tool_BaiduSitemap::createSitemapIndexContents($pcSitemapFilesIndexInfo), 'index.xml');
$this->createBaiduSitemapIndexFile(Tool_BaiduSitemap::createSitemapIndexContents($mSitemapFilesIndexInfo), 'm_index.xml');
}
}
//todo 优化
function carConfig()
{
$db_car["hostname"] = "localhost";
$db_car["username"] = "xxx";
$db_car["password"] = "xxx";
$db_car["database"] = "xxxx";
$db_car["charset"] = "utf8";
$db_car["pconnect"] = 0;
$db_car["log"] = 0;
$db_car["logfilepath"] = './';
return $db_car;
}
}
(3) linux写定时任务
- 命令行:crontab -e
- 参数1:定时
- 参数2 路径
- 参数3 执行程序
* */1 * * * cd /home/xxxx/xxx/xxxx/data; php create_xxxxx_sitemap.php
每小时执行一次创建sitemap的程序
网友评论