class Sitemap {
private static $baseURL = 'www.bugshoot.cn';
private static $subDir = '/sitemap/';
private static $mobile_type = 'htmladapt';
private static $mobileUrl = 'http://www.bugshoot.cn/thread-';
private static $pcUrl = 'http://www.bugshoot.cn/thread-';
private static $zonePcUrl = 'http://www.bugshoot.cn/thread-';
private static $zoneMobileUrl = 'http://www.bugshoot.cn/thread-';
public function mapCreate() {
header('Content-type:text/html;charset=utf-8');
$maxid = 0;
$minid = 0;
$psize = 1000;
$maxXml = 2000;
$where = array();
$index = 'index.txt';
$askXml = "../sitemap.xml";
if (!file_exists($index)) {
$fp = fopen("$index", "w+");
if (!is_writable($index)) {
die("文件:" . $index . "不可写,请检查!");
}
fclose($fp);
} else {
$fp = file($index);
$string = $fp[count($fp) - 1];
$arr = explode(',', $string);
}
if (!$arr[1]) {
$bs = 1;
$filename = 0;
} else {
if ($arr && $arr[3] < $maxXml) {
$filename = $arr[0];
$psize = $maxXml - $arr[3] > $psize ? $psize : ($maxXml - $arr[3]);
$bs = 0;
} else {
$filename = $arr[0] + 1;
$bs = 1;
}
}
$maxid = empty($arr[1]) ? 0 : $arr[1];
$minid = empty($arr[2]) ? 0 : $arr[2];
echo "文件名称:" . $filename . ".xml" . "
";
echo "最大id:" . $maxid . "
";
echo "最小id:" . $minid . "
";
echo "xml写入最大记录:" . $maxXml . "
";
echo "数据库每次读取数量:" . $psize . "
";
$query = new queryObj($maxid, $psize);
$list = $query->getList();
if (count($list) <= 0) {
echo 1;
exit;
}
$record = intval($arr[3] + count($list));
$indexArr = array('filename' => $filename, 'maxid' => $maxid, 'minid' => $minid, 'maxXml' => $record);
$start = ' ' . chr(10);
$start.= "" . chr(10);
$start.= "";
$xml = '';
foreach ($list as $k => $qinfo) {
if ($k == 0) $indexArr['minid'] = $qinfo['tid'];
$qinfo['lastmod'] = substr($qinfo['last_date'], 0, 10);
$qinfo['mobielurl'] = self::$mobileUrl . $qinfo['tid'] . '.htm';
$qinfo['pcurl'] = self::$pcUrl . $qinfo['tid'] . '.htm';
$xml.= $this->sitemapMobileUrl($qinfo, 'weekly', self::$mobile_type);
$xml.= $this->sitemapPcUrl($qinfo, 'weekly');
}
$maxid = end($list);
$indexArr['maxid'] = $maxid['tid'];
if ($bs == 0) {
$txt = file($index);
$txt[count($txt) - 1] = $indexArr['filename'] . ',' . $indexArr['maxid'] . ',' . $indexArr['minid'] . ',' . $indexArr['maxXml'] . "\r\n";
$str = join($txt);
if (is_writable($index)) {
if (!$handle = fopen($index, 'w')) {
echo "不能打开文件 $index";
exit;
exit;
}
if (fwrite($handle, $str) === FALSE) {
echo "不能写入到文件 $index";
fclose($handle);
exit;
exit;
}
echo "成功地写入文件$index";
fclose($handle);
} else {
echo "文件 $index 不可写";
exit;
}
} elseif ($bs == 1) {
$fp = fopen($index, 'a');
$num = count($list);
$string = $indexArr['filename'] . ',' . $indexArr['maxid'] . ',' . $indexArr['minid'] . ',' . $num . "\r\n";
if (fwrite($fp, $string) === false) {
echo "追加新行失败。。。";
exit;
} else {
echo "追加成功
";
$xmlData = '' . chr(10);
$xmlData.= "" . chr(10);
$xmlData.= "";
if (!file_exists($askXml)) file_put_contents($askXml, $xmlData);
$fileList = file($askXml);
$fileCount = count($fileList);
$sitemapxml = 'http://' . self::$baseURL . self::$subDir . "{$filename}.xml";
$txt = $this->siteMapIndex($sitemapxml);
$fileList[$fileCount - 1] = $txt . "";
$newContent = '';
foreach ($fileList as $v) {
$newContent.= $v;
}
if (!file_put_contents($askXml, $newContent)) exit('无法写入数据');
echo '已经写入文档' . $askXml;
}
fclose($fp);
}
$filename = $filename . '.xml';
if (!file_exists($filename)) file_put_contents($filename, $start);
$xmlList = file($filename);
$xmlCount = count($xmlList);
$xmlList[$xmlCount - 1] = $xml . "";
$newXml = '';
foreach ($xmlList as $v) {
$newXml.= $v;
}
if (!file_put_contents($filename, $newXml)) exit("写入数据错误");
else echo "写入数据成功
";
}
private function sitemapMobileUrl($data, $changefreq, $mobile_type) {
$xml = '';
if (is_array($data) && !empty($data)) {
$xml.= "" . chr(10);
if ($data['tid']) $xml.= '' . $data['mobielurl'] . '' . chr(10);
$xml.= ". $mobile_type ."\"/>" . chr(10);
if ($data['lastmod']) $xml.= '' . $data['lastmod'] . '' . chr(10);
$xml.= ''. $changefreq .'' . chr(10);
$xml.= '0.8' . chr(10);
$xml.= "" . chr(10);
return $xml;
}
}
private function sitemapPcUrl($data, $changefreq) {
$xml = '';
if (is_array($data) && !empty($data)) {
$xml.= '' . chr(10);
if ($data['tid']) $xml.= '' . $data['pcurl'] . '' . chr(10);
if ($data['lastmod']) $xml.= '' . $data['lastmod'] . '' . chr(10);
$xml.= ''. $changefreq .'' . chr(10);
$xml.= '0.8' . chr(10);
$xml.= '' . chr(10);
return $xml;
}
}
private function siteMapIndex($filename) {
$xml = '';
$xml.= "" . chr(10);
$xml.= "{$filename}" . chr(10);
$xml.= "" . date("Y-m-d", time()) . "" . chr(10);
$xml.= "" . chr(10);
return $xml;
}
}
class DB {
public $con = NULL;
private $user;
private $pwd;
private $dbname;
function __construct($dbname='', $user='', $pwd='')
{
$this->user=$user;
$this->pwd=$pwd;
$this->dbname=$dbname;
$this->con = new PDO('mysql:host=127.0.0.1;dbname=' . $this->dbname . ';', $this->user, $this->pwd,
[PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES `utf8`',PDO::ATTR_PERSISTENT=> TRUE]);
$this->con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->con->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER);
}
public function query($sql, $para = NULL)
{
$sqlType = strtoupper(substr($sql, 0, 6));
$cmd = $this->con->prepare($sql);
if($para != NULL)
{
$cmd->execute($para);
}
else
{
$cmd->execute();
}
if($sqlType == 'SELECT')
{
return $cmd->fetchAll();
}
if($sqlType == 'INSERT')
{
return $this->con->lastInsertId();
}
return $cmd->rowCount();
}
}
class queryObj
{
private $maxid;
private $psize;
private $db;
function __construct($maxid = 0, $psize = 1000)
{
$this->maxid = $maxid;
$this->psize = $psize;
$this->db = new DB('bugshoot.cn', 'bugshoot.cn', 'bugshoot.cn');
}
public function getList()
{
echo '#####0####\n\r';
echo $this->maxid;
echo '\n\r#####1####';
$sql = 'SELECT tid,last_date FROM bbs_thread limit ' . ($this->maxid + 0) . ',' . $this->psize . ';';
echo $sql;
echo '\n\r#####2####\n\r';
$list = $this->db->query($sql);
return $list;
}
}
$s = new Sitemap();
$s->mapCreate();