首頁 > 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.qsexmk.tw
 */
function getPushSoUrl($url)
{
    $token = "your token";
    return $str = "https://s.#/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!