首页 > php > phpcms > > 正文

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

发布人:zhoulujun    点击:

上个月对网站迁移总结了三篇文章,分别为网站迁移云服务器血泪记—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!