• home > php > phpcms >

    phpcms站点用php脚本自动刷新腾讯云CDN

    Author:zhoulujun Date:

    上个月对网站迁移总结了三篇文章,分别为网站迁移云服务器血泪记—phpcms小站迁移phpcms v9站http升级到https加http2遇到到坑Nginx葵花宝

    到此,网站运行对基本问题解决了。但是,网站,添加内容,因为本站首页和列表也都是没有生成静态html,而是动态php链接,在CDN把php文件 缓存时间设置为0,即可。

    但是,网站内容更新,CDN无法同步。


    百度搜索下相关教程,发现只有wordpress的。腾讯云官方 api说明也对参数做相关详细解释。点击到官方提供对demo文件里面,才知道个大概。于是新对折腾就此开始。其中细节不再陈述(too sample……),show code

    在 extention.func.php 文件里面加上(直接复制代码即可

     $api,
            CURLOPT_POST => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POSTFIELDS => implode("\n", $bdurls),
            CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
        );
        curl_setopt_array($ch, $options);
        $result = curl_exec($ch);
        $result = json_decode($result, 1);
        return $result;
    }
    
    /**
     * 刷新DNS
     * @param  {Array} $bdurls
     * @return result
     */
    
    function refresh_CDN($bdurls)
    {
    
        /*需要填写你的密钥,可从  https://console.qcloud.com/capi 获取 SecretId 及 $secretKey*/
        $secretKey = '“your key';
        $secretId = "your id";
        $action = 'RefreshCdnUrl';
    
        /*****************参数************************/
        /**
         * 参数名        类型        是否必填        描述
         * urls            array          是         刷新的目录
         **/
        /*参数转换,放在这里其实不应该*/
    
        $PRIVATE_PARAMS = array();
        foreach ($bdurls as $k => $v) {
            $PRIVATE_PARAMS["urls." . $k] = $v;
        }
        var_export($PRIVATE_PARAMS);
        $HttpUrl = "cdn.api.qcloud.com";
    
        /*除非有特殊说明,如MultipartUploadVodFile,其它接口都支持GET及POST*/
        $HttpMethod = "POST";
    
        /*是否https协议,大部分接口都必须为https,只有少部分接口除外(如MultipartUploadVodFile)*/
        $isHttps = true;
    
        /*下面这五个参数为所有接口的 公共参数;对于某些接口没有地域概念,则不用传递Region(如DescribeDeals)*/
        $COMMON_PARAMS = array(
            'Nonce' => rand(),
            'Timestamp' => time(NULL),
            'Action' => $action,
            'SecretId' => $secretId,
        );
    
        /***********************************************************************************/
        function CreateRequest($HttpUrl, $HttpMethod, $COMMON_PARAMS, $secretKey, $PRIVATE_PARAMS, $isHttps)
        {
            $FullHttpUrl = $HttpUrl . "/v2/index.php";
    
            /***************对请求参数 按参数名 做字典序升序排列,注意此排序区分大小写*************/
            $ReqParaArray = array_merge($COMMON_PARAMS, $PRIVATE_PARAMS);
            ksort($ReqParaArray);
    
            /**********************************生成签名原文**********************************
             * 将 请求方法, URI地址,及排序好的请求参数  按照下面格式  拼接在一起, 生成签名原文,此请求中的原文为
             * GETcvm.api.qcloud.com/v2/index.php?Action=DescribeInstances&Nonce=345122&Region=gz
             * &SecretId=AKIDz8krbsJ5yKBZQ    ·1pn74WFkmLPx3gnPhESA&Timestamp=1408704141
             * &instanceIds.0=qcvm12345&instanceIds.1=qcvm56789
             * ****************************************************************************/
            $SigTxt = $HttpMethod . $FullHttpUrl . "?";
    
            $isFirst = true;
            foreach ($ReqParaArray as $key => $value) {
                if (!$isFirst) {
                    $SigTxt = $SigTxt . "&";
                }
                $isFirst = false;
    
                /*拼接签名原文时,如果参数名称中携带_,需要替换成.*/
                if (strpos($key, '_')) {
                    $key = str_replace('_', '.', $key);
                }
    
                $SigTxt = $SigTxt . $key . "=" . $value;
            }
    
            /*********************根据签名原文字符串 $SigTxt,生成签名 Signature******************/
            $Signature = base64_encode(hash_hmac('sha1', $SigTxt, $secretKey, true));
    
    
            /***************拼接请求串,对于请求参数及签名,需要进行urlencode编码********************/
            $Req = "Signature=" . urlencode($Signature);
            foreach ($ReqParaArray as $key => $value) {
                $Req = $Req . "&" . $key . "=" . urlencode($value);
            }
    
            /*********************************发送请求********************************/
            if ($HttpMethod === 'GET') {
                if ($isHttps === true) {
                    $Req = "https://" . $FullHttpUrl . "?" . $Req;
                } else {
                    $Req = "http://" . $FullHttpUrl . "?" . $Req;
                }
    
                $Rsp = file_get_contents($Req);
    
            } else {
                if ($isHttps === true) {
                    $Rsp = SendPost("https://" . $FullHttpUrl, $Req, $isHttps);
                } else {
                    $Rsp = SendPost("http://" . $FullHttpUrl, $Req, $isHttps);
                }
            }
    
            var_export(json_decode($Rsp, true));
            return json_decode($Rsp, true);
        }
    
        function SendPost($FullHttpUrl, $Req, $isHttps)
        {
    
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $Req);
    
            curl_setopt($ch, CURLOPT_URL, $FullHttpUrl);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            if ($isHttps === true) {
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            }
    
            $result = curl_exec($ch);
    
            return $result;
        }
    
        return CreateRequest($HttpUrl, $HttpMethod, $COMMON_PARAMS, $secretKey, $PRIVATE_PARAMS, $isHttps);
    
    }
    
    
    /**
     * 360推送 @www.zhoulujun.cn
     */
    function getPushSoUrl($url)
    {
        $token = "your token";
        return $str = "https://s.360.cn/so/zz.gif?url=" . urlencode($url) . "&sid=" . $token . "&token=" . getPushToken($url, $token);
    }
    
    function getPushToken($url, $o)
    {
        $n = str_split($url, 1);
        $n = array_reverse($n);
        $r = str_split($o, 1);
        $i = [];
        for ($s = 0, $o = 16; $s token=$token;
        }
    //    function __construct($token) {
    //        $this->token=$token;
    //    }
        public function getPushToken($url,$o){
            $n = str_split($url,1);
            $n=array_reverse($n);
            $r = str_split($o,1);
            $i=[];
            for($s=0,$o=16;$stoken."&token=".$this->getPushToken($url,$this->token);
        }
    
    
    }
    
    ?>

    然后在phpcms/modules/contetn/create_html.php

    if($content_ishtml) {
    				$this->url = pc_base::load_app_class('url');
    				$this->db->set_model($modelid);
    				if(empty($_POST['ids'])) showmessage(L('you_do_not_check'));
    				$this->html = pc_base::load_app_class('html');
    				$ids = implode(',', $_POST['ids']);
    				$rs = $this->db->select("catid='$catid' AND id IN ($ids)");
    				$tablename = $this->db->table_name.'_data';
    				foreach($rs as $r) {
    					if($r['islink']) continue;
    					$this->db->table_name = $tablename;
    					$r2 = $this->db->get_one(array('id'=>$r['id']));
    					if($r2) $r = array_merge($r,$r2);
    					//判断是否为升级或转换过来的数据
    					if(!$r['upgrade']) {
    						$urls = $this->url->show($r['id'], '', $r['catid'],$r['inputtime']);
    					} else {
    						$urls[1] = $r['url'];
    					}
    					if( strpos($r['url'],SITE_URL)){
                            $bdurls[] = $r['url'];
                        }else{
                            $bdurls[] = SITE_PROTOCOL.SITE_URL.$r['url'];
                        }
    
    					$this->html->show($urls[1],$r,0,'edit',$r['upgrade']);
    				}
                    $push_result = push_baidu($bdurls);
                    $refresh_result= refresh_CDN($bdurls);
    
                    $msg = '';
                    if($push_result['success'] < 1){
                        $msg = '百度联盟推送链接失败!';
                    }
                    if($refresh_result['codeDesc']!=="Success"){
                        $msg=$msg."CDN推送失败:".$refresh_result["codeDesc"];
                    }
    				showmessage(L('operation_success').$msg,HTTP_REFERER);


    最后在phpcms/model/content_model.class.php

    //生成静态
    		if(!$isimport && $data['status']==99) {
                //百度推送
                $bdurls[] = SITE_PROTOCOL.SITE_URL.$urls[1];
                $push_result = push_baidu($bdurls);
                refresh_CDN($bdurls);
    
                $msg = '';
                if ($push_result['success'] index();
    			if(defined('RELATION_HTML')) $html->create_relation_html($catid);
    
    		}

    和此处替换

    //生成静态
    if(!$isimport && $data['status']==99) {
              //百度推送
              $bdurls[] = SITE_PROTOCOL.SITE_URL.$urls[1];
              $push_result = push_baidu($bdurls);
              refresh_CDN($bdurls);
    
              $msg = '';
              if ($push_result['success'] index();
       if(defined('RELATION_HTML')) $html->create_relation_html($catid);
    
    }

    至此,上传替换文件,okay!



    转载本站文章《phpcms站点用php脚本自动刷新腾讯云CDN》,
    请注明出处:https://www.zhoulujun.cn/html/php/phpcms/2018_0710_8128.html