ThinkPHP提供了靈活的全局配置功能,采用最有效率的PHP返回數組方式定義,支持慣例配置、公共配置、模塊配置、調試配置和動態配置。
對于有些簡單的應用,你無需配置任何配置文件,而對于復雜的要求,你還可以增加動態配置文件。
系統的配置參數是通過靜態變量全局存取的,存取方式簡單高效。
# 配置格式
## PHP數組定義
ThinkPHP框架中默認所有配置文件的定義格式均采用返回**PHP數組**的方式,格式為:
~~~
//項目配置文件
return array(
'DEFAULT_MODULE' => 'Index', //默認模塊
'URL_MODEL' => '2', //URL模式
'SESSION_AUTO_START' => true, //是否開啟session
//更多配置參數
//...
);
~~~
配置參數不區分大小寫(因為無論大小寫定義都會轉換成小寫),所以下面的配置等效:
~~~
//項目配置文件
return array(
'default_module' => 'Index', //默認模塊
'url_model' => '2', //URL模式
'session_auto_start' => true, //是否開啟session
//更多配置參數
//...
);
~~~
但是我們建議保持大寫定義配置參數的規范。
還可以在配置文件中可以使用二維數組來配置更多的信息,例如:
~~~
//項目配置文件
return array(
'DEFAULT_MODULE' => 'Index', //默認模塊
'URL_MODEL' => '2', //URL模式
'SESSION_AUTO_START' => true, //是否開啟session
'USER_CONFIG' => array(
'USER_AUTH' => true,
'USER_TYPE' => 2,
),
//更多配置參數
//...
);
~~~
> 需要注意的是,二級參數配置區分大小寫,也就說讀取確保和定義一致。
## 其他配置格式支持
也可以采用`yaml/json/xml/ini`以及自定義格式的配置文件支持。
我們可以在**應用入口文件**中定義應用的配置文件的后綴,例如:
~~~
define('CONF_EXT','.ini');
~~~
定義后,應用的配置文件(包括模塊的配置文件)后綴都統一采用.ini。
> 無論是什么格式的配置文件,最終都會解析成數組格式。
> 該配置不會影響框架內部的配置文件加載。
**ini格式**配置示例:
~~~
DEFAULT_MODULE=Index ;默認模塊
URL_MODEL=2 ;URL模式
SESSION_AUTO_START=on ;是否開啟session
~~~
**xml格式**配置示例:
~~~
<config>
<default_module>Index</default_module>
<url_model>2</url_model>
<session_auto_start>1</session_auto_start>
</config>
~~~
**yaml格式**配置示例:
~~~
default_module:Index #默認模塊
url_model:2 #URL模式
session_auto_start:True #是否開啟session
~~~
**json格式**配置示例:
~~~
{
"default_module":"Index",
"url_model":2,
"session_auto_start":True
}
~~~
除了`yaml/json/xml/ini`格式之外,我們還可以自定義配置格式,定義如下:
~~~
define('CONF_EXT','.test'); // 配置自定義配置格式(后綴)
define('CONF_PARSE','parse_test'); // 對應的解析函數
~~~
假設我們的自定義配置格式是類似` var1=val1&var2=val2` 之類的字符串,那么parse_test定義如下:
~~~
function parse_test($str){
parse_str($str,$config);
return (array)$config;
}
~~~
> CONF_PARSE定義的解析函數返回值必須是一個PHP索引數組。
# 配置加載
在ThinkPHP中,一般來說應用的配置文件是自動加載的,加載的順序是:
#### 慣例配置->應用配置->模式配置->調試配置->狀態配置->模塊配置->擴展配置->動態配置
> 以上是配置文件的加載順序,因為后面的配置會覆蓋之前的同名配置(在沒有生效的前提下),所以配置的優先順序從右到左。
下面說明下不同的配置文件的區別和位置:
## 慣例配置
慣例重于配置是系統遵循的一個重要思想,框架內置有一個慣例配置文件(位于`ThinkPHP/Conf/convention.php`),按照大多數的使用對常用參數進行了默認配置。所以,對于應用的配置文件,往往只需要配置和慣例配置不同的或者新增的配置參數,如果你完全采用默認配置,甚至可以不需要定義任何配置文件。
> 建議仔細閱讀下系統的慣例配置文件中的相關配置參數,了解下系統默認的配置參數。
## 應用配置
應用配置文件也就是調用所有模塊之前都會首先加載的公共配置文件(默認位于`Application/Common/Conf/config.php`)。
> 如果更改了公共模塊的名稱的話,公共配置文件的位置也相應改變
## 模式配置(可選)
如果使用了普通應用模式之外的應用模式的話,還可以為應用模式(后面會有描述)單獨定義配置文件,文件命名規范是: `Application/Common/Conf/config_應用模式名稱.php`(僅在運行該模式下面才會加載)。
> 模式配置文件是可選的
## 調試配置(可選)
如果開啟調試模式的話,則會自動加載框架的調試配置文件(位于`ThinkPHP/Conf/debug.php`)和應用調試配置文件(位于`Application/Common/Conf/debug.php`)
## 狀態配置(可選)
每個應用都可以在不同的情況下設置自己的狀態(或者稱之為應用場景),并且加載不同的配置文件。
舉個例子,你需要在公司和家里分別設置不同的數據庫測試環境。那么可以這樣處理,在公司環境中,我們在入口文件中定義:
~~~
define('APP_STATUS','office');
~~~
那么就會自動加載該狀態對應的配置文件(位于`Application/Common/Conf/office.php`)。
如果我們回家后,我們修改定義為:
~~~
define('APP_STATUS','home');
~~~
那么就會自動加載該狀態對應的配置文件(位于`Application/Common/Conf/home.php`)。
> 狀態配置文件是可選的
## 模塊配置
每個模塊會自動加載自己的配置文件(位于`Application/當前模塊名/Conf/config.php`)。
如果使用了普通模式之外的其他應用模式,你還可以為應用模式單獨定義配置文件,命名規范為: `Application/當前模塊名/Conf/config_應用模式名稱.php`(僅在運行該模式下面才會加載)。
模塊還可以支持獨立的狀態配置文件,命名規范為: `Application/當前模塊名/Conf/應用狀態.php`。
如果你的應用的配置文件比較大,想分成幾個單獨的配置文件或者需要加載額外的配置文件的話,可以考慮采用擴展配置或者動態配置(參考后面的描述)。
# 讀取配置
無論何種配置文件,定義了配置文件之后,都統一使用系統提供的C方法(可以借助Config單詞來幫助記憶)來讀取已有的配置。
用法:
#### C('參數名稱')
例如,讀取當前的URL模式配置參數:
~~~
$model = C('URL_MODEL');
// 由于配置參數不區分大小寫,因此下面的寫法是等效的
// $model = C('url_model');
~~~
但是建議使用大寫方式的規范。
> 注意:配置參數名稱中不能含有 “.” 和特殊字符,允許字母、數字和下劃線。
如果`url_model`尚未存在設置,則返回NULL。
支持在讀取的時候設置默認值,例如:
~~~
// 如果my_config尚未設置的話,則返回default_config字符串
C('my_config',null,'default_config');
~~~
C方法也可以用于讀取二維配置:
~~~
//獲取用戶配置中的用戶類型設置
C('USER_CONFIG.USER_TYPE');
~~~
因為配置參數是全局有效的,因此C方法可以在任何地方讀取任何配置,即使某個設置參數已經生效過期了。
# 動態配置
之前的方式都是通過預先定義配置文件的方式,而在具體的操作方法里面,我們仍然可以對某些參數進行動態配置(或者增加新的配置),主要是指那些還沒有被使用的參數。
設置格式:
#### C('參數名稱','新的參數值')
例如,我們需要動態改變數據緩存的有效期的話,可以使用
~~~
// 動態改變緩存有效期
C('DATA_CACHE_TIME',60);
~~~
> 動態配置賦值僅對當前請求有效,不會對以后的請求造成影響。
動態改變配置參數的方法和讀取配置的方法在使用上面非常接近,都是使用C方法,只是參數的不同。
也可以支持二維數組的讀取和設置,使用點語法進行操作,如下:
~~~
// 獲取已經設置的參數值
C('USER_CONFIG.USER_TYPE');
// 設置新的值
C('USER_CONFIG.USER_TYPE',1);
~~~
# 擴展配置
擴展配置可以支持自動加載額外的自定義配置文件,并且配置格式和項目配置一樣。
設置擴展配置的方式如下(多個文件用逗號分隔):
~~~
// 加載擴展配置文件
'LOAD_EXT_CONFIG' => 'user,db',
~~~
假設擴展配置文件`user.php` 和`db.php`分別用于用戶配置和數據庫配置,這樣做的好處是哪怕以后關閉調試模式,你修改db配置文件后依然會自動生效。
如果在應用公共設置文件中配置的話,那么會自動加載應用公共配置目錄下面的配置文件`Application/Common/Conf/user.php`和`Application/Common/Conf/db.php`。
如果在模塊(假設是Home模塊)的配置文件中配置的話,則會自動加載模塊目錄下面的配置文件 `Application/Home/Conf/user.php` 和 `Application/Home/Conf/db.php`。
默認情況下,擴展配置文件中的設置參數會并入項目配置文件中。也就是默認都是一級配置參數,例如user.php中的配置參數如下:
~~~
<?php
//用戶配置文件
return array(
'USER_TYPE' => 2, //用戶類型
'USER_AUTH_ID' => 10, //用戶認證ID
'USER_AUTH_TYPE' => 2, //用戶認證模式
);
~~~
那么,最終獲取用戶參數的方式是:
~~~
C('USER_AUTH_ID');
~~~
如果配置文件改成:
~~~
// 加載擴展配置文件
'LOAD_EXT_CONFIG' => array('USER'=>'user','DB'=>'db'),
~~~
則最終獲取用戶參數的方式改成:
~~~
C('USER.USER_AUTH_ID');
~~~
# 批量配置
C配置方法支持批量配置,例如:
~~~
$config = array('WEB_SITE_TITLE'=>'ThinkPHP','WEB_SITE_DESCRIPTION'=>'開源PHP框架');
C($config);
~~~
$config數組中的配置參數會合并到現有的全局配置中。
我們可以通過這種方式讀取數據庫中的配置參數,例如:
~~~
// 讀取數據庫中的配置(假設有一個config表用于保存配置參數)
$config = M('Config')->getField('name,value');
// config是一個關聯數組 鍵值就是配置參數 值就是配置值
// 例如: array('config1'=>'val1','config2'=>'val2',...)
C($config); // 合并配置參數到全局配置
~~~
合并之后,我們就可以和前面讀取普通配置參數一樣,讀取數據庫中的配置參數了,當然也可以動態改變。
~~~
// 讀取合并到全局配置中的數據庫中的配置參數
C('CONFIG1');
// 動態改變配置參數(當前請求有效,不會自動保存到數據庫)
C('CONFIG2','VALUE_NEW');
~~~
- 序
- 前言
- 內容簡介
- 目錄
- 基礎知識
- 起步
- 控制器
- 模型
- 模板
- 命名空間
- 進階知識
- 路由
- 配置
- 緩存
- 權限
- 擴展
- 國際化
- 安全
- 單元測試
- 拿來主義
- 調試方法
- 調試的步驟
- 調試工具
- 顯示trace信息
- 開啟調試和關閉調試的區別
- netbeans+xdebug
- Socketlog
- PHP常見錯誤
- 小黃鴨調試法,每個程序員都要知道的
- 應用場景
- 第三方登錄
- 圖片處理
- 博客
- SAE
- REST實踐
- Cli
- ajax分頁
- barcode條形碼
- excel
- 發郵件
- 漢字轉全拼和首字母,支持帶聲調
- 中文分詞
- 瀏覽器useragent解析
- freelog項目實戰
- 需求分析
- 數據庫設計
- 編碼實踐
- 前端實現
- rest接口
- 文章發布
- 文件上傳
- 視頻播放
- 音樂播放
- 圖片幻燈片展示
- 注冊和登錄
- 個人資料更新
- 第三方登錄的使用
- 后臺
- 微信的開發
- 首頁及個人主頁
- 列表
- 歸檔
- 搜索
- 分頁
- 總結經驗
- 自我提升
- 進行小項目的鍛煉
- 對現有輪子的重構和移植
- 寫技術博客
- 制作視頻教程
- 學習PHP的知識和新特性
- 和同行直接溝通、交流
- 學好英語,走向國際
- 如何參與
- 瀏覽官網和極思維還有看云
- 回答ThinkPHP新手的問題
- 嘗試發現ThinkPHP的bug,告訴官方人員或者push request
- 開發能提高效率的ThinkPHP工具
- 嘗試翻譯官方文檔
- 幫新手入門
- 創造基于ThinkPHP的產品,進行連帶推廣
- 展望未來
- OneThink
- ThinkPHP4
- 附錄