ホームページ >バックエンド開発 >PHPチュートリアル >PHP が Baidu サイトマップを生成する サイトマップ クラス関数 instance_PHP チュートリアル

PHP が Baidu サイトマップを生成する サイトマップ クラス関数 instance_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:16:40941ブラウズ

phpはBaiduサイトマップサイトマップクラス関数インスタンスを生成します

問題の概要:

会社の Web サイトは Q&A 百科事典 Web サイトであり、SEO エンジニアは Web サイト上の質問に基づいて XML ファイルを生成するように要求しました。各 XML ファイルには 5000 のセットマップ形式のデータが含まれています。現在、オンライン Web サイトには約 700,000 件の質問があるため、基本的に 140 個の XML ファイルが生成されます。インデックスファイルもあります。たとえば、ファイル名は数字で始まります。インデックス ファイルの内容は、各 XML ファイルのパスと名前です。
なぜ各ファイルに 5,000 個のデータを保存する必要があるのでしょうか? これは、毎回大量に取得すると、オンライン ユーザーのアクセスに影響を与えたり、速度が低下したりする可能性があるためです。各ファイルには 5,000 個のデータが格納されますが、mysql selsect を使用する場合、毎回 5,000 個を取得することはできません。今書かれているのは、毎回 1,000 個のデータを取得することです。その場合、ロジックは少し複雑になります。

実装方法:

最初に 1000 個のデータを取り出し (後で変更するために柔軟に保存できます)、次にループで XML 形式のファイルを生成します。 file_puts_contens はファイルを書き込みます。そして、生成したxmlファイル名、取得した質問の最小id、取得した質問の最大id、取得した質問の数をインデックスクエリ用のtxtファイルに書き込みます。
0,3146886,3145887,1000
最初に 1000 個のデータを選択し、それらを 0.xml ファイルに書き込みました。最後の項目数は 1000 でした。抽出した XML ファイル名、最小 ID、最大 ID、エントリ数をインデックス クエリ テキストに書き込みます。初めて 0.xml に 1000 個のデータが書き込まれ、生成された個数は 1000 個になりました。 select ステートメントが 2 番目のクエリになります。 ここで、 id > 取り出した最大 ID (現在、mysql は順方向のクエリですが、逆順の場合は、それより小さい値に変更します) 制限 1000 この場合、1000 を取り出し、最小 ID と最大 ID を変更します。インデックス クエリ テキストの値を変更し、生成されたアイテムの数を 2000 に追加します。類推すると、生成されたアイテムの数が 5000 に達したら、次のように別の行を開始してインデックス ファイルに書き込みます
0,3146886,3145887,5000
1,3148886,3147887,1000
この方法で記述すると、サーバーへの負荷が軽減されます。
実装コードは以下に掲載されています (スタイルは少し乱雑です):

具体的な関数コードは次のとおりです:

コードは次のとおりです:

/*
* SiteMap インターフェースクラス
*/

class SitemapAction extends Action{
private static $baseURL = '' //URL アドレス
; private static $askMobileUrl = 'http://m.xxx.cn/ask/' //Q&A モバイル版アドレス
; private static $askPcUrl = "http://www.xxx.cn/ask/" //Q&A PC アドレス
; private static $askZonePcUrl = "http://www.xxx.cn/ask/jingxuan/" //Q&A 選択された PC リンク
private static $askZoneMobileUrl = "http://m.xxx.cn/ask/jx/" //Q&A 選択されたモバイル版リンク
; //Q&A セットマップ
パブリック関数 askSetMap(){
header('Content-type:text/html;charset=utf-8');
//質問リストを取得します
$maxid = 0; //インデックスファイルの最大ID
$minid = 0; //インデックスファイルの最小ID
; $psize = 1000 //毎回データベースから取得される量
; $maxXml = 5000 //xmlに書き込まれたレコード数
; $where = array();
//インデックスファイルを読み込みます
$index = APP_PATH.'setmapxml/Index.txt';
//セットマップのパスを関連付けます
$askXml = "../siteditu/ask/ask.xml";
if(!file_exists($index)){
$fp=fopen("$index", "w+");
if ( !is_writable($index) ){
die("ファイル:" .$index. "書き込み不可です。確認してください!");
}
fclose($fp);
}その他{
//index.txt ファイルの説明 0: XML ファイル名 (1 から始まる)、1: 最大ファイル ID、2: 最小ファイル ID、3: ファイルの現在のレコード番号
$fp = ファイル($index);
$string = $fp[count($fp)-1];//最後の行を表示
$arr =explode(',', $string);
}
//インデックスファイルの数が$maxXml
未満かどうか // 初めて実行する場合
if(!$arr[1]){
$bs=1;
$ファイル名=0;
}その他{
if($arr && $arr[3]<$maxXml){
$filename = $arr[0];
$psize = $maxXml-$arr[3]>$psize?$psize:($maxXml-$arr[3]);
$bs = 0;
}その他{
$filename = $arr[0]+1;
$bs=1;
}
}
$maxid = empty($arr[1])?0:$arr[1];
$minid = empty($arr[2])?0:$arr[2];
echo "ファイル名:".$filename.".xml"."
";
echo "maxid:".$maxid."
";
echo "最小 ID:".$minid."
";
echo "XML に書き込まれた最大レコード:".$maxXml."
";
echo "データベースごとの読み取り数:".$psize."
";
$list = self::$questionObj->getQuestionSetMap($where,$maxid,$psize);
if(count($list) エコー 1;終了;
}
$record = $arr[3]+count($list); //インデックスファイルに書き込まれるレコード数
$indexArr = array('filename'=>$filename,'maxid'=>$maxid,'minid'=>$minid,'maxXml'=>$record);
$start = ' '.chr(10);
$start.="".chr(10);
                                                                     foreach($list as $k=>$qinfo){
if($k==0)
$indexArr['minid']=$qinfo['id'];
$qinfo['lastmod'] = substr($qinfo['lasttime'],0,10);
$qinfo['mobieurl'] = self::$askMobileUrl.$qinfo['id'].'.html' //モバイル版リンク
; $qinfo['pcurl'] = self::$askPcUrl.$qinfo['id'].'-p1.html' //PC版リンク
; $xml.=$this->askMapMobileUrl($qinfo) //モバイル版
; $xml.=$this->askMapPcUrl($qinfo) //PC版
; }
$maxid = end($list);
$indexArr['maxid'] = $maxid['id'];
//インデックスファイルを更新
if($bs==0){
//最後の行を更新します
$txt = ファイル($index);
$txt[count($txt)-1] = $indexArr[ファイル名].','.$indexArr[maxid].','.$indexArr['minid'].','.$indexArr['maxXml' ]."rn";
$str = join($txt);
if (is_writable($index)) {
if (!$handle = fopen($index, 'w')) {
echo "ファイル $index を開けません";終了;
終了します;
}
if (fwrite($handle, $str) === FALSE) {
echo "ファイル $index に書き込めません";終了;
終了します;
}
echo "ファイル $index に正常に書き込まれました";
fclose($handle);
} その他 {
echo "ファイル $index は書き込み可能ではありません";終了;
}
fclose($index);
}elseif($bs==1){
//新しい行を追加します
$fp = fopen($index,'a');
$num = count($list);
$string = $indexArr[ファイル名].','.$indexArr[maxid].','.$indexArr['minid'].','.$num."rn";
if(fwrite($fp,$string)===false){
echo "新しい行を追加できませんでした...";終了;
}その他{
echo "追加に成功しました
";
//サイトマップインデックスファイルを更新します
$xmlData="".chr(10);
$xmlData.="".chr(10);
$xmlData.="
";
if(!file_exists($askXml))
file_put_contents($askXml,$xmlData);
$fileList = ファイル($askXml);
$fileCount = count($fileList);
$setmapxml = "http://www.xxx.cn/ask/setmapxml/{$filename}.xml";//通常の質問リンク
$txt = $this->setMapIndex($setmapxml);
$fileList[$fileCount-1]=$txt."";
$newContent = '';
foreach($fileList as $v){
$newContent.= $v;
}
if(!file_put_contents($askXml,$newContent)) exit('データを書き込めません');
echo 'ドキュメントが書き込まれました' . }
fclose($fp);
}
$filename = APP_PATH.'setmapxml/'.$filename.'.xml';
//xml ファイルを更新し、末尾を追加します
If(!file_exists($filename))
file_put_contents($filename,$start);
$xmlList = file($filename);
$xmlCount = count($fileList);
$xmlList[$xmlCount-1]=$xml."
";
$newXml = '';
foreach($xmlList as $v){
$newXml.= $v;
}
if(!file_put_contents($filename, $newXml))exit("データ書き込みエラー");
その他
echo "データは正常に書き込まれました
";
}
//Q&Aモバイル版xml
プライベート関数 askMapMobileUrl($data){
$xml = '';
if(is_array($data)&&!empty($data)){
$xml .="".chr(10);
if($data['id'])
$xml.=''.$data['mobileurl'].''.chr(10);//モバイル版リンク
$xml.="".chr(10);
if($data['lastmod'])
$xml.=''.$data['lastmod'].''.chr(10);
$xml.='daily'.chr(10);
$xml.='0.8'.chr(10); $xml.="
".chr(10);
$xml を返します;
}
}
//Q&A PC版xml
プライベート関数 askMapPcUrl($data){
$xml = '';
if(is_array($data)&&!empty($data)){
$xml.=''.chr(10);
if($data['id'])
$xml.=''.$data['pcurl'].''.chr(10);//PC版リンク
if($data['lastmod'])
$xml.=''.$data['lastmod'].''.chr(10);
$xml.='daily'.chr(10);
$xml.='0.8'.chr(10);
$xml.='
'.chr(10);
$xml を返します;
}
}
//setmaps インデックス ファイル
プライベート関数 setMapIndex($filename){
$xml = '';
$xml.="<サイトマップ>".chr(10);
$xml.="{$filename}".chr(10);
$xml.="".date("Y-m-d",time())."".chr(10);
$xml.="".chr(10);
$xml を返します;
}
}
?>

XML インデックス ファイルの形式は次のとおりです:

コードは次のとおりです:


<サイトマップインデックス>
<サイトマップ>
http://www.xxx.cn/ask/setmapxml/0.xml
2014-05-12

<サイトマップ>
http://www.xxx.cn/ask/setmapxml/1.xml
2014-05-12



XML ファイル形式 (各ファイルには 5000 項目を保存する必要があります。現在は 1 つの例が示されています)

コードは次のとおりです:



http://m.xxx.cn/ask/7460.html

2013-01-11
毎日
0.8優先度>




SQL コードについては、主に select ステートメントであるため、ここでは掲載しません。

http://www.bkjia.com/PHPjc/896776.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/896776.html技術記事 PHP による Baidu サイトマップのサイトマップ クラス関数の例の問題の概要: 会社の Web サイトは Q&A 百科事典 Web サイトであり、SEO エンジニアは Web サイトの質問に基づいて XML ファイルを生成するリクエストを行いました。毎回...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。