PHP Curl 实现生成网站地图(sitemap.xml)

描述: 使用php的curl函数模拟访问进行测试url是否可以访问 使用正则表达式进行处理 仅仅支持a标签href的格式为斜杠开头的地址,其余均不支持 。
qq:1404591249 功能实现的不怎么地,有完善的意见或建议欢迎打扰,感谢!

  • 2.实现功能:
    • 1.生成sitemap.xml地图。
    • 2.返回可以访问成功的页面。
    • 3.返回访问失败的页面。
    • 4.返回所有页面。
  • 3.遇到问题:
    • 1.apache的超时问题,在生成地图需要的时间比较长,但是apache40秒直接结束会话,原因是缺少一段代码。解决方案如下
      phpstudy 集成版 apache 运行40秒后报500服务器错误,但是没有错误日志,原因暂时没有了解,解决方案在下

把这个加到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;
        }

    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值