이 기사의 예에서는 PHP에서 Baidu 사이트맵 사이트맵 클래스 함수를 생성하는 방법을 설명하고 참고용으로 모든 사람과 공유합니다. 구체적인 구현 방법은 다음과 같습니다.
문제 개요:
회사 홈페이지는 Q&A 백과사전 홈페이지인데, SEO 엔지니어가 홈페이지 질문을 바탕으로 xml 파일 생성을 요청했습니다. 각 xml 파일에는 5000개의 setmap 형식 데이터가 포함되어 있습니다. 현재 온라인 홈페이지에는 약 70만개 정도의 질문이 있으므로 기본적으로 140개의 xml 파일이 생성됩니다. 인덱스 파일도 있습니다. 예를 들어 파일 이름은 숫자로 시작됩니다. 인덱스 파일의 내용은 각 xml 파일의 경로와 이름입니다.
왜 각 파일에 5,000개의 데이터를 저장해야 합니까? 이는 mysql의 한계 값이기 때문입니다. 매번 너무 많이 가져오면 온라인 사용자 액세스에 영향을 미치거나 속도가 느려질 수 있습니다. 각 파일에는 5,000개의 데이터가 저장되어 있는데, mysql select를 사용하면 매번 5,000개를 가져올 수 없습니다. 지금 작성한 내용은 매번 1,000개를 가져오는 것입니다. 그러면 논리가 좀 복잡해집니다.
구현 방법:
먼저 1000개의 데이터를 꺼낸 다음(나중에 수정하기 위해 더 유연할 수 있음) 루프에서 xml 형식 파일을 생성합니다. file_puts_contens는 파일을 씁니다. 그런 다음 생성된 xml 파일 이름, 검색된 질문의 최소 ID, 검색된 질문의 최대 ID 및 검색된 질문 수를 인덱스 쿼리용 txt 파일에 작성합니다. 형식은 대략 다음과 같습니다.
0,3146886,3145887,1000
마지막 항목 수가 1000개라는 것을 확인하셨나요? 처음으로 데이터 항목 1000개를 선택하여 0.xml 파일에 씁니다. 추출된 xml 파일 이름, 최소 ID, 최대 ID, 항목 수를 인덱스 쿼리 txt에 씁니다. 처음으로 0.xml에 1,000개의 데이터가 기록되었고, 생성된 데이터의 개수는 1,000개였습니다. 두 번째로 쿼리할 때 select 문이 됩니다. 여기서 id > 꺼낸 최대 id (현재 mysql은 정방향 쿼리이고, 역순이면 이하로 변경) Limit 1000 이 경우에는 1000을 더 빼낸 후 최소 id와 최대를 빼냅니다. 인덱스 쿼리 txt의 id가 수정되어 생성된 항목 수가 2000개로 추가됩니다. 비유하자면, 생성된 항목 수가 5000개에 도달하면 다음과 비슷하게 다른 줄을 시작하여 인덱스 파일에 씁니다.
0,3146886,3145887,5000
1,3148886,3147887,1000
이렇게 작성하면 서버에 가해지는 부담이 줄어듭니다.
구현 코드는 아래에 게시되어 있습니다(스타일이 약간 지저분합니다):
구체적인 기능 코드는 다음과 같습니다.
/*
* 사이트맵 인터페이스 클래스
*/
SitemapAction 클래스는 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 세트맵
공개 함수 AskSetMap(){
header('Content-type:text/html;charset=utf-8');
//질문 목록 가져오기
$maxid = 0; //인덱스 파일의 최대 id
$minid = 0; //인덱스 파일의 최소 id
$psize = 1000; //매번 데이터베이스에서 가져오는 수량
$maxXml = 5000; //xml에 작성된 레코드 개수
$where = 배열();
//인덱스 파일 읽기
$index = APP_PATH.'setmapxml/Index.txt';
//setmaps 경로 연결
$askXml = "../siteeditu/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 = 폭발(',', $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 = 비어 있음($arr[1])?0:$arr[1];
$minid = 비어 있음($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)<=0){
에코 1;종료;
}
$record = $arr[3] count($list); //인덱스 파일에 기록된 레코드 수
$indexArr = array('filename'=>$filename,'maxid'=>$maxid,'minid'=>$minid,'maxXml'=>$record);
$start = ' '.chr(10);
$start.="".chr(10);
$start.="";
foreach($list as $k=>$qinfo){
if($k==0)
$indexArr['minid']=$qinfo['id'];
$qinfo['lastmod'] = substr($qinfo['lasttime'],0,10);
$qinfo['mobielurl'] = 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 = 조인($txt);
if (is_writable($index)) {
if (!$handle = fopen($index, 'w')) {
echo "$index 파일을 열 수 없습니다";exit;
나가세요;
}
if (fwrite($handle, $str) === FALSE) {
echo "$index 파일에 쓸 수 없습니다";exit;
나가세요;
}
echo "$index 파일에 성공적으로 기록되었습니다.";
fclose($handle);
} 그 밖의 {
echo "$index 파일에 쓸 수 없습니다.";exit;
}
fclose($index);
}elseif($bs==1){
//새 줄 추가
$fp = fopen($index,'a');
$num = 개수($list);
$string = $indexArr[파일 이름].','.$indexArr[maxid].','.$indexArr['minid'].','.$num."rn";
if(fwrite($fp,$string)===false){
echo "새 줄을 추가하지 못했습니다...";exit;
}그밖에{
echo "성공적으로 추가
";
//사이트맵 색인 파일 업데이트
$xmlData="".chr(10);
$xmlData.="".chr(10);
$xmlData.="";
if(!file_exists($askXml))
file_put_contents($askXml,$xmlData);
$fileList = 파일($askXml);
$fileCount = 개수($fileList);
$setmapxml = "http://www.xxx.cn/ask/setmapxml/{$filename}.xml";//일반 질문 링크
$txt = $this->setMapIndex($setmapxml);
$fileList[$fileCount-1]=$txt."";
$newContent = '';
foreach($fileList를 $v로 표시){
$newContent.= $v;
}
if(!file_put_contents($askXml,$newContent))exit('데이터를 쓸 수 없습니다');
echo '문서가 작성되었습니다' . $askXml;
}
fclose($fp);
}
$filename = APP_PATH.'setmapxml/'.$filename.'.xml';
//xml 파일로 업데이트하고 엔딩
추가
If(!file_exists($filename))
file_put_contents($filename,$start);
$xmlList = 파일($filename);
$xmlCount = 개수($fileList);
$xmlList[$xmlCount-1]=$xml."";
$newXml = '';
foreach($xmlList를 $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['mobielurl'].''.chr(10);//모바일 버전 링크
$xml.="".chr(10);
if($data['lastmod'])
$xml.=''.$data['lastmod'].''.chr(10);
$xml.='매일'.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.='매일'.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 문이므로 여기에는 게시하지 않습니다.
이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.