標籤:合并 close efi 命名 常量 刪除 read 複製 代碼
最近在用@ThinkPHP 做系統的時候,要用到一個功能,就要動態將系統的配置參數儲存到Config檔案中。以往,我們做系統的時候,項目的配置參數都會直接事先寫入到Config/Config.php檔案中,然後在項目中應用即可。但是,有些項目,使用者需要根據自己的情況將配置參數,通過後台動態來設定。這種動態參數配置,一般我們有兩種方式,一種是寫入到資料庫,另一種就是寫入到設定檔。今天,我來說說用設定檔的形式來實現這一功能。
一、設定檔設定
首先,我們在TP項目配置目錄Config下建立一個設定檔,命名為setting.config.php,這個檔案用以儲存動態參數。然後,項目主設定檔Config.php中用合并數組的方式,將setting.config.php合并進來。這樣,在整個項目中,即可調用setting.config.php中的配置參數了。
二、實現動態管理參數
在後台,建立一個功能,將setting.config.php的預設值讀出,並顯示在一個表單中。這裡可以使用TP的C函數實現。然後,即可在表單中對各個參數的值進行設定。表單提交儲存後,將表單提交的值,進行處理,具體代碼如下:
setting.config.php檔案的結構
- <?php
- return array(
- ‘setting‘=>array(
- ‘tel‘ => ‘400-088-7380‘,
- ‘qq‘ => ‘88888888‘,
- ......
- ),
- );
- ?>
複製代碼
儲存配置參數的操作
- function SaveSetting(){
- //setting.config.php檔案的路徑,通過settingfile_path來設定;
- $setfile=‘./Home‘.C(‘settingfile_path‘);
- $a=C(‘setting‘); //將預設配置參數的內容賦值給$a;
- $b=array(
- ‘tel‘ => $_POST[‘tel‘],
- ‘web‘ => $_POST[‘web‘],
- ........
- );
- //這裡將新的參數值,通過背景表單提交過來;
-
- $c=array_merge($a,$b) ;
複製代碼
//將數組$a和$b合并;我們知道,array_merge()函數,可以合并兩個數組,並且如果數組元素具有相同的鍵名,後面的值會覆蓋前面的值(數字鍵名除外);
然後,將合并後的數組$c的值進行遍曆後,產生php檔案代碼;
- $settingstr="<?php \n return array(\n‘Setting‘ =>array(\n";
- foreach($c as $key=>$v){
- $settingstr.= "\t‘".$key."‘=>‘".$v."‘,\n";
- }
- $settingstr.="),\n);\n?>\n";
- file_put_contents($setfile,$settingstr); //通過file_put_contents儲存setting.config.php檔案;
複製代碼
到此,setting.config.php檔案的配置參數的值,已經被更新;
寫入檔案是個數組不假,但是可以參考一下var_export函數,沒有必要去迴圈數組了!
- $settingstr="<?php \n return array(\n‘Setting‘ =>array(\n";
- foreach($c as $key=>$v){
- $settingstr.= "\t‘".$key."‘=>‘".$v."‘,\n";
- }
- $settingstr.="),\n);\n?>\n";
- file_put_contents($setfile,$settingstr); //通過file_put_contents儲存setting.config.php檔案;
複製代碼複製代碼
以上代碼可以修改為:
- $settingstr = "<?php \n return array(\n‘Setting‘ =>\n".var_export($c,true)." \n ?>";
- file_put_contents($setfile,$settingstr); //通過file_put_contents儲存
(Thinkphp3.1版本,已經支援C函數儲存設定的參數值,所以,本方法,適合於3.0及以下版本的TP)
另外,我們知道TP在第一次運行時會把項目所有的設定檔,配置參數等,產生一個runtime快取檔案,如果我們更新了congfig 的內容,那麼必須刪除項目中的快取檔案後才會生效。為此,我們讓系統自己來清空緩衝,更新參數。代碼如下:
- //RUNTIME_FILE常量是入口檔案中配置的runtimefile的路徑及檔案名稱;
- if(file_exists(RUNTIME_FILE)){
- unlink(RUNTIME_FILE); //刪除RUNTIME_FILE;
- }
- 光刪除runtime_file還不夠,要清空一下Cache檔案夾中的檔案;代碼如下:
- $cachedir=RUNTIME_PATH."/Cache/"; //Cache檔案的路徑;
- if ($dh = opendir($cachedir)) { //開啟Cache檔案夾;
- while (($file = readdir($dh)) !== false) { //遍曆Cache目錄,
- unlink($cachedir.$file); //刪除遍曆到的每一個檔案;
- }
- closedir($dh);
- }
複製代碼
到此,整個動態配置參數檔案,並清空緩衝的功能全部實現。
thinkphp 動態配置