1. 程式人生 > 其它 >tp3.2行為擴充套件在靜態快取前增加pvuv網站統計或一些操作

tp3.2行為擴充套件在靜態快取前增加pvuv網站統計或一些操作

技術標籤:thinkphp3.2thinkphpphp

網站配置靜態快取

\Index\Common\Conf\config.php

  'HTML_CACHE_ON'   => true,     // 開啟靜態快取
    'HTML_CACHE_TIME' => 7200,   // 全域性靜態快取有效期(秒)(3600*24*7)
    'HTML_FILE_SUFFIX'=> '.shtml',  // 設定靜態快取檔案字尾
    'HTML_CACHE_RULES'=> array(    // 定義靜態快取規則
     'Index:index'    =>array('{:controller}_{:action}/index'),
        // 定義格式1 陣列方式
        // 定義格式2 字串方式
        //後一個引數是靜態快取有效期,單位為秒。如果不定義,則會獲取配置引數HTML_CACHE_TIME 的設定值,如果定義為0則表示永久快取。
)

//增加操作

行為擴充套件 檢視手冊

app_init    應用初始化標籤位
path_info   PATH_INFO檢測標籤位
app_begin   應用開始標籤位
action_name 操作方法名標籤位
action_begin    控制器開始標籤位
view_begin  檢視輸出開始標籤位
view_parse  檢視解析標籤位
template_filter 模板內容解析標籤位
view_filter 檢視輸出過濾標籤位
view_end    檢視輸出結束標籤位
action_end  控制器結束標籤位
app_end         應用結束標籤位

比如說配置表單令牌

Index\Common\Conf\tags.php

<?php
return array(
    'view_filter'  =>array(
        'Behavior\TokenBuildBehavior', // 表單令牌
    ),
);
Behavior\TokenBuildBehavior檔案路徑具體位置:\ThinkPHP\Library\Behavior\TokenBuildBehavior.class.php

所以在這個同目錄下建立一個檔案

CountBehavior.class.php
<?php
/**
 * 網站統計
 */
namespace Behavior;

use Org\Util\RedisManager;


class CountBehavior {
    // 行為擴充套件的執行入口必須是run
    public function run(&$params){
        if (C('COUNT_ON')) {//如果沒有這個判斷所有應用都會執行
           var_dump(session());die;
        }
    }
}

配置完成後需要在配置檔案中加上COUNT_ON這個值

\Index\Common\Conf\config.php

    'COUNT_ON'   => true,     // 開啟網站統計
    'HTML_CACHE_ON'   => true,     // 開啟靜態快取
    'HTML_CACHE_TIME' => 7200,   // 全域性靜態快取有效期(秒)(3600*24*7)
    'HTML_FILE_SUFFIX'=> '.shtml',  // 設定靜態快取檔案字尾
    'HTML_CACHE_RULES'=> array(    // 定義靜態快取規則
      'Index:index'    =>array('{:controller}_{:action}/index'),
        // 定義格式1 陣列方式
        // 定義格式2 字串方式
        //後一個引數是靜態快取有效期,單位為秒。如果不定義,則會獲取配置引數HTML_CACHE_TIME 的設定值,如果定義為0則表示永久快取。
    )

當前配置好了

先看看快取目錄有沒有檔案,測試快取生效\Index\Html,有檔案生成

Index\Common\Conf\tags.php裡面配置的行為是在tp核心公共配置之後的,如果開始靜態後想要在tags檔案配置靜態前做些東西,可能有些麻煩

看公共配置檔案\ThinkPHP\Mode\common.php

 // 行為擴充套件定義
    'tags'  =>  array(
        'app_init'     =>  array(
            'Behavior\BuildLiteBehavior', // 生成執行Lite檔案
        ),        
        'app_begin'     =>  array(
            'Behavior\ReadHtmlCacheBehavior', // 讀取靜態快取
        ),
        'app_end'       =>  array(
            'Behavior\ShowPageTraceBehavior', // 頁面Trace顯示
        ),
        'view_parse'    =>  array(
            'Behavior\ParseTemplateBehavior', // 模板解析 支援PHP、內建模板引擎和第三方模板引擎
        ),
        'template_filter'=> array(
            'Behavior\ContentReplaceBehavior', // 模板輸出替換
        ),
        'view_filter'   =>  array(
            'Behavior\WriteHtmlCacheBehavior', // 寫入靜態快取
        ),
    ),

這些是預設的行為擴充套件。對應app_begin的是先讀取靜態快取檔案

按照先後順序,那麼有兩種方法

1.在應用下Index\Common\Conf\tags.php配置app_init,並呼叫方法

    'app_init'     =>  array(
            'Behavior\CountBehavior',
        ),

2.直接在tp的公共配置檔案\ThinkPHP\Mode\common.php裡面加入行為控制,並在靜態快取讀取之前

  // 行為擴充套件定義
    'tags'  =>  array(
        'app_init'     =>  array(
            'Behavior\BuildLiteBehavior', // 生成執行Lite檔案
        ),        
        'app_begin'     =>  array(
            'Behavior\CountBehavior',//順序執行,在靜態之前載入,但是需要初始化應用後
            'Behavior\ReadHtmlCacheBehavior', // 讀取靜態快取
        ),
        'app_end'       =>  array(
            'Behavior\ShowPageTraceBehavior', // 頁面Trace顯示
        ),
        'view_parse'    =>  array(
            'Behavior\ParseTemplateBehavior', // 模板解析 支援PHP、內建模板引擎和第三方模板引擎
        ),
        'template_filter'=> array(
            'Behavior\ContentReplaceBehavior', // 模板輸出替換
        ),
        'view_filter'   =>  array(
            'Behavior\WriteHtmlCacheBehavior', // 寫入靜態快取
        ),
    ),

這樣按照先後順序就可以在讀取靜態檔案之前進行一些操作

如果想要在這裡讀取session需再去找些配置,比如從入口檔案開始追

index.php
   require './ThinkPHP/ThinkPHP.php';
\ThinkPHP\ThinkPHP.php
   Think\Think::start();
\ThinkPHP\Library\Think\Think.class.php
   App::run();
\ThinkPHP\Mode\Api\App.class.php
   static public function run() {
        // 應用初始化標籤
        Hook::listen('app_init');
        App::init();
        // 應用開始標籤
        Hook::listen('app_begin');
        // Session初始化
        if(!IS_CLI){
            session(C('SESSION_OPTIONS'));
        }
        // 記錄應用初始化時間
        G('initTime');
        App::exec();
        // 應用結束標籤
        Hook::listen('app_end');
        return ;
    }

可以看到session初始化是在app_begin之後的,如果要使用session就需要在app_begin之後,session是可以調整位置的,可以把它調整到app_begin前面

   static public function run() {
        // 應用初始化標籤
        Hook::listen('app_init');
        App::init();
        // Session初始化
        if(!IS_CLI){
            session(C('SESSION_OPTIONS'));
        }
        // 應用開始標籤
        Hook::listen('app_begin');
        // 記錄應用初始化時間
        G('initTime');
        App::exec();
        // 應用結束標籤
        Hook::listen('app_end');
        return ;
    }

這樣就可以在讀取靜態檔案前幹些事情,可以讀取session

就這些~ ^∨^