php生成sitemapindex程序精較版

<?php
/*
http://www.baidu.com/schemas/sitemap-mobile/1/
https://www.baidu.com/schemas/sitemap-mobile/1/sitemap-mobile.xsd
https://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd
*/
class Sitemap {
    private static $baseURL = 'www.bugshoot.cn'; //URL地址
    private static $subDir = '/sitemap/';
    private static $mobile_type = 'htmladapt';//enum:mobile, pc, htmladapt
    private static $mobileUrl = 'http://www.bugshoot.cn/thread-'; //移動版地址
    private static $pcUrl = 'http://www.bugshoot.cn/thread-'; //pc地址
    private static $zonePcUrl = 'http://www.bugshoot.cn/thread-'; //精選Pc鏈接
    private static $zoneMobileUrl = 'http://www.bugshoot.cn/thread-'; //精選移動版鏈接
    //sitemaps
    public function mapCreate() {
        header('Content-type:text/html;charset=utf-8');
        //獲取問題列表
        $maxid = 0; //索引文件最大id
        $minid = 0; //索引文件最小id
        $psize = 1000; //數據庫每次取數量
        $maxXml = 2000; //xml寫入記錄數量
        $where = array();
        //讀取索引文件
        $index = 'index.txt';
        //關聯sitemaps路徑
        $askXml = "../sitemap.xml";
        if (!file_exists($index)) {
            $fp = fopen("$index", "w+");
            if (!is_writable($index)) {
                die("文件:" . $index . "不可寫,請檢查!");
            }
            fclose($fp);
        } else {
            //index.txt文件說明 0:xml文件名稱(從1開始)、1:文件最大id、2:文件最小id、3:文件當前記錄數
            $fp = file($index);
            $string = $fp[count($fp) - 1]; //顯示最後一行
            $arr = explode(',', $string);
        }
        //索引文件數量是否小於$maxXml
        //如果爲第一次運行
        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" . "<br/ >";
        echo "最大id:" . $maxid . "<br />";
        echo "最小id:" . $minid . "<br />";
        echo "xml寫入最大記錄:" . $maxXml . "<br />";
        echo "數據庫每次讀取數量:" . $psize . "<br />";

        $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 = '<?xml  version="1.0" encoding="utf-8"?> ' . chr(10);
        $start.= "<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:mobile=\"http://www.baidu.com/schemas/sitemap-mobile/1/\">" . chr(10);
        $start.= "</urlset>";
        $xml = '';
        foreach ($list as $k => $qinfo) {
            #print_r($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'; //pc版鏈接
            $xml.= $this->sitemapMobileUrl($qinfo, 'weekly', self::$mobile_type); //移動版
            $xml.= $this->sitemapPcUrl($qinfo, 'weekly'); //pc版
        }
        $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;
            }
            #fclose($index);
        } 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 "追加成功<br />";
                //更新sitemap索引文件
                $xmlData = '<?xml  version="1.0" encoding="utf-8"?>' . chr(10);
                $xmlData.= "<sitemapindex>" . chr(10);
                $xmlData.= "</sitemapindex>";
                if (!file_exists($askXml)) file_put_contents($askXml, $xmlData);
                $fileList = file($askXml);
                $fileCount = count($fileList);
                $sitemapxml = 'http://' . self::$baseURL . self::$subDir . "{$filename}.xml"; //正常sitemap鏈接
                $txt = $this->siteMapIndex($sitemapxml);
                $fileList[$fileCount - 1] = $txt . "</sitemapindex>";
                $newContent = '';
                foreach ($fileList as $v) {
                    $newContent.= $v;
                }
                if (!file_put_contents($askXml, $newContent)) exit('無法寫入數據');
                echo '已經寫入文檔' . $askXml;
            }
            fclose($fp);
        }
        $filename =  $filename . '.xml';
        //更新到xml文件中,增加結尾
        if (!file_exists($filename)) file_put_contents($filename, $start);
        $xmlList = file($filename);
        $xmlCount = count($xmlList);
        $xmlList[$xmlCount - 1] = $xml . "</urlset>";
        $newXml = '';
        foreach ($xmlList as $v) {
            $newXml.= $v;
        }
        if (!file_put_contents($filename, $newXml)) exit("寫入數據錯誤");
        else echo "寫入數據成功<br />";
    }
    //移動版xml
    private function sitemapMobileUrl($data, $changefreq, $mobile_type) {
        $xml = '';
        if (is_array($data) && !empty($data)) {
            $xml.= "<url>" . chr(10);
            if ($data['tid']) $xml.= '<loc>' . $data['mobielurl'] . '</loc>' . chr(10); //移動版鏈接
            $xml.= "<mobile:mobile type=\"". $mobile_type ."\"/>" . chr(10);
            if ($data['lastmod']) $xml.= '<lastmod>' . $data['lastmod'] . '</lastmod>' . chr(10);
            $xml.= '<changefreq>'. $changefreq .'</changefreq>' . chr(10);
            $xml.= '<priority>0.8</priority>' . chr(10);
            $xml.= "</url>" . chr(10);
            return $xml;
        }
    }
    //pc版xml
    private function sitemapPcUrl($data, $changefreq) {
        $xml = '';
        if (is_array($data) && !empty($data)) {
            $xml.= '<url>' . chr(10);
            if ($data['tid']) $xml.= '<loc>' . $data['pcurl'] . '</loc>' . chr(10); //pc版鏈接
            if ($data['lastmod']) $xml.= '<lastmod>' . $data['lastmod'] . '</lastmod>' . chr(10);
            $xml.= '<changefreq>'. $changefreq .'</changefreq>' . chr(10);
            $xml.= '<priority>0.8</priority>' . chr(10);
            $xml.= '</url>' . chr(10);
            return $xml;
        }
    }
    //sitemaps索引文件
    private function siteMapIndex($filename) {
        $xml = '';
        $xml.= "<sitemap>" . chr(10);
        $xml.= "<loc>{$filename}</loc>" . chr(10);
        $xml.= "<lastmod>" . date("Y-m-d", time()) . "</lastmod>" . chr(10);
        $xml.= "</sitemap>" . chr(10);
        return $xml;
    }
}

class DB {
  //pdo對象
  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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章