描述: 使用php的curl函数模拟访问进行测试url是否可以访问 使用正则表达式进行处理 仅仅支持a标签href的格式为斜杠开头的地址,其余均不支持 。
qq:1404591249 功能实现的不怎么地,有完善的意见或建议欢迎打扰,感谢!
- 2.实现功能:
- 1.生成sitemap.xml地图。
- 2.返回可以访问成功的页面。
- 3.返回访问失败的页面。
- 4.返回所有页面。
- 3.遇到问题:
- 1.apache的超时问题,在生成地图需要的时间比较长,但是apache40秒直接结束会话,原因是缺少一段代码。解决方案如下
phpstudy 集成版 apache 运行40秒后报500服务器错误,但是没有错误日志,原因暂时没有了解,解决方案在下
- 1.apache的超时问题,在生成地图需要的时间比较长,但是apache40秒直接结束会话,原因是缺少一段代码。解决方案如下
把这个加到httpd.con里面,就可以解决了 这是phpstudy中一个id名叫 许家陵 解决的,感谢!
<IfModule mod_fcgid.c>
FcgidProcessLifeTime 8200
FcgidIOTimeout 8200
FcgidConnectTimeout 4000
</IfModule>
<?php
class sitemap{
static $domain; //域名
static $surplusArr; //所有url地址
static $urlSuccessArr; // 成功的url地址
static $urlErrorArr; //失败的url地址
static $level; //层级
static $preg_Arr; //正则
/**
*
* sitemap constructor.
* @param $domain /域名
* @param $level /层级
*/
public function __construct($domain,$level)
{
self::$domain=$domain;
self::$level=intval($level);
self::$surplusArr=[];
self::$urlSuccessArr=[];
self::$urlErrorArr=[];
static::$preg_Arr = [
1 => '\/([a-zA-Z0-9\_\-\.]+)',
2 => '(\/([a-zA-Z0-9\_\-\.]+)\/([a-zA-Z0-9\_\-\.]+))',
3 => '(\/([a-zA-Z0-9\_\-\.]+)\/([a-zA-Z0-9\_\-\.]+)\/([a-zA-Z0-9\_\-\.]+))',
4 => '(\/([a-zA-Z0-9\_\-\.]+)\/([a-zA-Z0-9\_\-\.]+)\/([a-zA-Z0-9\_\-\.]+)\/([a-zA-Z0-9\_\-\.]+))',
5 => '(\/([a-zA-Z0-9\_\-\.]+)\/([a-zA-Z0-9\_\-\.]+)\/([a-zA-Z0-9\_\-\.]+)\/([a-zA-Z0-9\_\-\.]+)\/([a-zA-Z0-9\_\-\.]+))',
];
}
/**
* 完整调用的一套。外围直接访问index即可
*/
public function index(){
$res=$this->curlRequest(self::$domain);
if($res['code']==200){
$this->pregHref($res['res']);
$this->handleAddress();
}
self::$surplusArr=array_merge(self::$surplusArr);
foreach(self::$surplusArr as $key=>$url){
if($key<200){
$this->curlRequest(self::$domain.$url);
}
}
$this->createFile();
}
/**
* 创建文件,存入xml格式的内容
*/
public function createFile(){
$fileText='<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" ?>
<urlset xmlns="https://www.looit.cn">';
foreach (self::$urlSuccessArr as $surplusAr){
$fileText.='
<url>
<loc>'.$surplusAr['url'].'</loc>
<priority>1.0</priority>
<lastmod>'.date("Y-m-d",time()).'T'.date("H:i:s+00:00",time()).'</lastmod>
<changefreq>Always</changefreq>
</url>
';
}
$fileText.='</urlset>';
$file=fopen("sitemap.xml","w");
fwrite($file,$fileText);
fclose($file);
}
/**
* 把获取到的url递归匹配
* @return array
*/
public function handleAddress(){
$i=0;
foreach (self::$surplusArr as $key => $url){
$res=$this->curlRequest(self::$domain.$url);
if($res['code']==200){
$this->pregHref($res['res']);
if(!in_array($url,self::$surplusArr)){
$i++;
}
}
}
self::$surplusArr=array_unique(self::$surplusArr);
if($i!=0){
return $this->handleAddress();
}else{
return self::$surplusArr;
}
}
/**
* 正则匹配,匹配页面中的url地址
* 目前的规则是:a标签href中的内容格式为斜杠开头的url,无后缀的不匹配
* @param $contents
*/
public function pregHref($contents){
switch (self::$level){
case 2:
$pattern= '/href="('.self::$preg_Arr[1].'||'.self::$preg_Arr[2].')"/';
break;
case 3:
$pattern= '/href="('.self::$preg_Arr[1].'||'.self::$preg_Arr[2].'||'.self::$preg_Arr[3].')"/';
break;
case 4:
$pattern= '/href="('.self::$preg_Arr[1].'||'.self::$preg_Arr[2].'||'.self::$preg_Arr[3].'||'.self::$preg_Arr[4].')"/';
break;
case 5:
$pattern= '/href="('.self::$preg_Arr[1].'||'.self::$preg_Arr[2].'||'.self::$preg_Arr[3].'||'.self::$preg_Arr[4].'||'.self::$preg_Arr[5].')"/';
break;
case 1:
$pattern= '/href="'.self::$preg_Arr[1].'"/';
break;
}
preg_match_all($pattern,$contents,$dir);
foreach ($dir[1] as $key=> $di){
$ext=explode(".",$di)[1];
if(!empty($ext) && $ext!='html' && $ext!='php' && $ext!='asp' ){
unset($di);
}
if(!empty($di)){
array_push(self::$surplusArr,$di);
}
}
self::$surplusArr=array_unique(self::$surplusArr);
}
/**
* 使用curl函数请求url 存入访问成功的页面和访问失败的页面
* @param $url
* @return array
*/
public function curlRequest($url){
$returnArr=[];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0.1);
$contents = curl_exec($ch);
$httpStatus= curl_getinfo($ch,CURLINFO_HTTP_CODE); //返回http状态
curl_close($ch);
$returnArr['code']=$httpStatus;
$returnArr['res']=$contents;
if($httpStatus==200){
$returnArr['title']=$this->pregTitle($contents);
if($this->removal($url,self::$urlSuccessArr)){
array_push(self::$urlSuccessArr,array('url'=>$url,'code'=>$returnArr['code'],'title'=>$returnArr['title']));
};
}else{
if($this->removal($url,self::$urlErrorArr)){
array_push(self::$urlErrorArr,array('url'=>$url,'code'=>$returnArr['code']));
};
}
return $returnArr;
}
public function pregTitle($contents){
$pattern= '/\<title\>(.*)\<\/title\>/';
preg_match($pattern,$contents,$title);
if(!empty($title[1])){
return $title[1];
}else{
return '';
}
}
/**
* 查看二维数组中有没有此值
* @param $val
* @param $array
* @return bool
*/
public function removal($val,$array){
$i=true;
foreach ($array as $arra){
if(in_array($val,$arra)){
$i=false;
}
}
return $i;
}
}