File: /www/wwwroot/shzthfdcpg.com/wp-content/plugins/baidusubmit/sitemap.php
<?php
/**
* Spider will crawl this file
*/
ini_set('display_errors', 0);
define('__BAIDU_START_TIME__', microtime(true));
if (!function_exists('add_action')) {
require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . './../../../wp-config.php';
}
set_time_limit(300);
$config = include dirname(__FILE__) . DIRECTORY_SEPARATOR . 'inc/const.php';
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'inc/options.php';
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'inc/sitemap.php';
if (!BaidusubmitOptions::getOption('enabled')) {
exit;
}
if (empty($_GET['p']) || $_GET['p'] != ($sppasswd = BaidusubmitOptions::getOption('sppasswd'))) {
BaidusubmitSitemap::headerStatus(404);
return 1;
}
$urlsuffix = "&p=$sppasswd";
//全量索引
if ('indexall' === $_GET['m']) {
$sitemapMaxTid = (int)BaidusubmitSitemap::getSitemapMaxEnd(BaidusubmitSitemap::TYPE_ALL); //sitemap表中最大tid
$maxTid = BaidusubmitSitemap::getMaxTid(); //论坛数据中最大tid
$count = $maxTid - $sitemapMaxTid;
//新数据够生成一个sitemap时,生成新的sitemap
if (!$sitemapMaxTid || $count >= $config['sitemapItemCount']) {
$sitemapCount = ceil($count/$config['sitemapItemCount']);
$next_tid = $sitemapMaxTid + 1;
for ($i = 0; $i < $sitemapCount; $i++) {
$start_tid = $next_tid + $i*$config['sitemapItemCount'];
$end_tid = $start_tid + $config['sitemapItemCount'] - 1;
$url = 'm=sitemapall&start='.$start_tid;
BaidusubmitSitemap::addSitemap($url, BaidusubmitSitemap::TYPE_ALL, $start_tid, $end_tid);
}
}
BaidusubmitSitemap::printIndexHeader();
$site = BaidusubmitOptions::getOption('siteurl');
$sitemapCount = BaidusubmitSitemap::getSitemapCount(BaidusubmitSitemap::TYPE_ALL);
$sitemapUrlCount = $config['sitemapUrlCount'] > 0 ? intval($config['sitemapUrlCount']) : 50000;
//全取出来
if ($sitemapCount <= $sitemapUrlCount) {
$sitemaplist = BaidusubmitSitemap::getSitemapList(BaidusubmitSitemap::TYPE_ALL, 0, $sitemapCount);
if (count($sitemaplist) > 0) {
BaidusubmitSitemap::printSitemapList($sitemaplist, $site, $urlsuffix);
}
BaidusubmitSitemap::printIndexFooter();
BaidusubmitSitemap::setIndexLastCrawl(0);
return 1;
}
//分段取
$lastcrawl = BaidusubmitSitemap::getIndexLastCrawl();
$time = time();
$pasttime = $time - $lastcrawl['stime'];
if ($pasttime < $config['sitemapStepTime']) { //没到一个时段则按上次的偏移量
$offset = intval($lastcrawl['offset']);
} else {
$step = $config['sitemapStepLength'];
if ($step > $sitemapUrlCount) {
$step = $sitemapUrlCount;
}
$offset = $lastcrawl['offset'] + $step * intval($pasttime / $config['sitemapStepTime']);
}
if ($offset > $sitemapCount) {
$offset = 0;
}
$sitemaplist = BaidusubmitSitemap::getSitemapList(BaidusubmitSitemap::TYPE_ALL, $offset, $sitemapUrlCount);
if (count($sitemaplist) > 0) {
BaidusubmitSitemap::printSitemapList($sitemaplist, $site, $urlsuffix);
}
//如果溢出了
$overflow = $offset + $sitemapUrlCount - $sitemapCount;
if ($overflow > 0) {
$sitemaplist = BaidusubmitSitemap::getSitemapList(BaidusubmitSitemap::TYPE_ALL, 0, $overflow);
if (count($sitemaplist) > 0) {
baidu_print_sitemap_list($sitemaplist, $site, $urlsuffix);
BaidusubmitSitemap::printSitemapList($sitemaplist, $site, $urlsuffix);
}
}
BaidusubmitSitemap::printIndexFooter();
BaidusubmitSitemap::setIndexLastCrawl($offset);
}
//增量索引
if ('indexinc' === $_GET['m']) {
$today = strtotime(date('Y-m-d'));
$removeTime = $today - $config['HistoryDayCount'] * 24 * 3600; //几天前时间
BaidusubmitSitemap::deleteIncreaseHistory($removeTime); //删除过期数据
$lastTime = BaidusubmitSitemap::getSitemapMaxEnd(BaidusubmitSitemap::TYPE_INC); //sitemap表中最后时间
if (empty($lastTime)) {
$lastTime = $today;
}
if ($today >= $lastTime) {
$url = 'm=sitemapinc&start='.$today;
BaidusubmitSitemap::addSitemap($url, BaidusubmitSitemap::TYPE_INC, $today, $today+86399);
}
BaidusubmitSitemap::printIndexHeader();
$sitemaps = BaidusubmitSitemap::getSitemapList(BaidusubmitSitemap::TYPE_INC);
if (count($sitemaps) > 0) { //返回增量sitemap的索引文件
$site = BaidusubmitOptions::getOption('siteurl');
BaidusubmitSitemap::printSitemapList($sitemaps, $site, $urlsuffix);
}
BaidusubmitSitemap::printIndexFooter();
}
//全量sitemap
if ('sitemapall' === $_GET['m']) {
$start_tid = intval($_GET['start']);
$sitemap = BaidusubmitSitemap::getSitemap(BaidusubmitSitemap::TYPE_ALL, $start_tid);
if (empty($sitemap)) {
BaidusubmitSitemap::headerStatus(404);
return 1;
}
$end_tid = $sitemap->end;
$pidlist = BaidusubmitSitemap::getPostIdByIdRange($start_tid, $end_tid);
$itemCount = 0;
$fileSize = 0;
$urlnum = 0;
$installmaxtid = BaidusubmitOptions::getOption('installmaxtid');
header('Content-Type: text/xml; charset=utf-8');
echo '<?xml version="1.0" encoding="UTF-8"?><urlset>';
foreach ($pidlist as $pid) {
$schema = BaidusubmitSitemap::genSchemaByPostId($pid, $post);
$output = $schema->toXml() . "\n";
$fileSizeCheck = $fileSize + strlen($output);
$itemCountCheck = $itemCount + 1;
// split sitemap file
if ($fileSizeCheck >= 1024*1024*8 || $itemCountCheck > 5000) {
// concurrent request
$sp = BaidusubmitSitemap::getSitemap(BaidusubmitSitemap::TYPE_ALL, $start_tid, $end_tid);
if ($sp) {
$new_start_tid = $post->ID;
$past_tid = $new_start_tid - $start_tid - 1;
$count = ceil(($end_tid - $new_start_tid) / $past_tid);
for ($i=0; $i<$count; $i++) {
$_xstart = $new_start_tid + $past_tid * $i;
$_xend = $_xstart + $past_tid - 1;
if ($_xend > $end_tid) {
$_xend = $end_tid;
}
$url = "m=sitemapall&start={$_xstart}";
BaidusubmitSitemap::addSitemap($url, BaidusubmitSitemap::TYPE_ALL, $_xstart, $_xend);
}
$new_end_tid = $new_start_tid - 1;
$new_url = "m=sitemapall&start={$start_tid}";
BaidusubmitSitemap::updateSitemap(
$sp->sid,
array('url' => $new_url, 'start' => $start_tid, 'end' => $new_end_tid));
$end_tid = $new_end_tid;
}
break;
}
echo $output;
$fileSize = $fileSizeCheck;
$itemCount = $itemCountCheck;
if ($tid <= $installmaxtid) {
$urlnum ++;
}
flush();
}
echo '</urlset>';
$timeLost = intval(1000 * (microtime(true) - __BAIDU_START_TIME__));
BaidusubmitSitemap::updateSitemap(
$sitemap->sid,
array('item_count' => $itemCount, 'file_size' => $fileSize, 'lost_time' => $timeLost));
BaidusubmitSitemap::updateUrlStat($urlnum);
}
//增量sitemap
if ('sitemapinc' === $_GET['m']) {
$startTime = intval(@$_GET['start']);
$sitemap = BaidusubmitSitemap::getSitemap(BaidusubmitSitemap::TYPE_INC, $startTime);
if (empty($sitemap)) {
BaidusubmitSitemap::headerStatus(404);
return 1;
}
$endTime = $sitemap->end;
define('_BAIDU_MAX_POST_COUNT_', 5000);
$pidlist = BaidusubmitSitemap::getPostIdByTimeRange($startTime, $endTime, _BAIDU_MAX_POST_COUNT_);
$indexsplitsitemap = false;
$postCount = count($pidlist);
if ($postCount >= _BAIDU_MAX_POST_COUNT_) {
$indexsplitsitemap = true;
}
$itemCount = 0;
$fileSize = 0;
$index = 0;
header('Content-Type: text/xml; charset=utf-8');
echo '<?xml version="1.0" encoding="UTF-8"?><urlset>';
$sizesplitsitemap = false;
foreach ($pidlist as $pid) {
$schema = BaidusubmitSitemap::genSchemaByPostId($pid, $post);
$output = $schema->toXml() . "\n";
$fileSizeCheck = $fileSize + strlen($output);
$itemCount += 1;
if ($fileSizeCheck >= 1024*1024*8) {
$sizesplitsitemap = true;
break;
}
$fileSize = $fileSizeCheck;
echo $output;
flush();
}
echo '</urlset>';
//分裂数据
if ($sizesplitsitemap || ($indexsplitsitemap && $thread['lastpost']<$endTime)) { //超过sitemap文件限制进行分裂
$sp = BaidusubmitSitemap::getSitemap(BaidusubmitSitemap::TYPE_INC, $startTime, $endTime);
if ($sp) {
//计算裂变
$newStartTime = strtotime($post->post_date);
//裂变步长
$stepLen = intval(($newStartTime - $startTime - 1) * 0.3);
$curTime = time();
//只裂变到当前时间
$count = ceil(($curTime - $newStartTime) / $stepLen);
for ($i=0; $i<$count; $i++) {
$_xstart = $newStartTime + $stepLen * $i;
$_xend = $_xstart + $stepLen - 1;
if ($_xend > $curTime) {
$_xend = $curTime;
}
$url = "m=sitemapinc&start={$_xstart}";
BaidusubmitSitemap::addSitemap($url, BaidusubmitSitemap::TYPE_INC, $_xstart, $_xend);
}
//把最后一个加上
$nextTime = $curTime + 1;
BaidusubmitSitemap::addSitemap("m=sitemapinc&start={$nextTime}", BaidusubmitSitemap::TYPE_INC, $nextTime, $endTime);
$newEndTime = $newStartTime - 1;
$newUrl = "m=sitemapinc&start={$startTime}";
BaidusubmitSitemap::updateSitemap(
$sp->sid,
array('url' => $newUrl, 'start' => $startTime, 'end' => $newEndTime));
$endTime = $newEndTime;
}
}
//记录相关数据
$timeLost = intval(1000 * (microtime(true) - __BAIDU_START_TIME__));
BaidusubmitSitemap::updateSitemap(
$sitemap->sid,
array('item_count' => $itemCount, 'file_size' => $fileSize, 'lost_time' => $timeLost));
BaidusubmitSitemap::updateUrlStat($itemCount);
}