PHP 无数据库读写配置文件

mengkun 2,329 17

做一个动态网页,一般都会有各种后台配置。如果只是少量的配置数据,单独弄个数据库来进行存储就显得有些“浪费”了。[aru_49]

下面分享一个自用的无数据库配置文件增删查改模块,可以很方便地存储读取数据。有需要的就拿去用吧[aru_151]

食用方法

新建一个 PHP 文件,命名为 Config.class.php,然后按照注释中的内容来使用就行~[aru_22]

  1. <?php  
  2.   
  3. /* 
  4. * @link https://mkblog.cn/ 
  5. * @author mengkun 
  6. * @license MIT 
  7. */  
  8.   
  9. /** 
  10.  * PHP 无数据库配置文件增删查改模块 
  11.  * !注:本模块未对高并发进行优化兼容,如果数据量或并发过大,还是用数据库比较好 :) 
  12.  *  
  13.  * 使用方法: 
  14.  *  
  15.  * 一、引用本模块 
  16.  *  
  17.  *  require_once 'Config.class.php'; 
  18.  *  
  19.  *  
  20.  * 二、初始化 
  21.  *  
  22.  *  $C = new Config('配置文件名');  // * 如果是在二级目录下,请确保该目录存在 
  23.  *  
  24.  *  
  25.  * 三、内置方法 
  26.  *  
  27.  *  - 存储(如果已存在则是修改)单条数据 
  28.  *  
  29.  *      $C->set('sitename', '孟坤博客'); 
  30.  *  
  31.  *  
  32.  *  - 存储(如果已存在则是修改)一个数组 
  33.  *       
  34.  *      $C->set('user', array('name'=>'peter', 'age'=>12)); 
  35.  *  
  36.  *  
  37.  *  - 读取一条数据 
  38.  *  
  39.  *      $C->get('user', '默认值'); 
  40.  *  
  41.  *  
  42.  *  - 删除一条数据 
  43.  *  
  44.  *      $C->delete('user'); 
  45.  *  
  46.  *  
  47.  *  - 保存对数据的修改 
  48.  *  
  49.  *      $C->save();     // 保存成功返回 true,否则返回失败原因 
  50.  *  
  51.  *   
  52.  * * 注:为了避免频繁地写文件,以上所有对数据的操作都必须调用一次 $C->save(); 才会真正被保存到配置文件中 
  53.  *       建议将所有的数据操作都执行完后再进行存储操作。 
  54.  *  
  55.  *  
  56.  * * 附:精简写法 
  57.  *  
  58.  *      $C->set('sitename', '孟坤博客')->save(); 
  59.  */  
  60.   
  61. define('CONFIG_EXIT', '<?php exit;?>');  
  62. class Config {  
  63.     private $data;  
  64.     private $file;  
  65.       
  66.     /** 
  67.      * 构造函数 
  68.      * @param $file 存储数据文件 
  69.      * @return  
  70.      */  
  71.     function __construct($file) {  
  72.         $file = $file.'.php';  
  73.         $this->file = $file;  
  74.         $this->data= self::read($file);  
  75.     }  
  76.       
  77.     /** 
  78.      * 读取配置文件 
  79.      * @param $file 要读取的数据文件 
  80.      * @return 读取到的全部数据信息 
  81.      */  
  82.     public function read($file) {  
  83.         if(!file_exists($file)) return array();  
  84.           
  85.         $str = file_get_contents($file);  
  86.         $str = substr($strstrlen(CONFIG_EXIT));  
  87.         $data = json_decode($str, true);  
  88.         if (is_null($data)) return array();  
  89.         return $data;  
  90.     }  
  91.       
  92.     /** 
  93.      * 获取指定项的值 
  94.      * @param $key 要获取的项名 
  95.      * @param $default 默认值 
  96.      * @return data 
  97.      */  
  98.     public function get($key = null, $default = '') {  
  99.         if (is_null($key)) return $this->data;  // 取全部数据  
  100.           
  101.         if(isset($this->data[$key])) return $this->data[$key];  
  102.         return $default;  
  103.     }  
  104.       
  105.     /** 
  106.      * 设置指定项的值 
  107.      * @param $key 要设置的项名 
  108.      * @param $value 值 
  109.      * @return null 
  110.      */  
  111.     public function set($key$value) {  
  112.         if(is_string($key)) {   // 更新单条数据  
  113.             $this->data[$key] = $value;  
  114.         } else if(is_array($key)) {   // 更新多条数据                 
  115.             foreach ($this->data as $k => $v) {  
  116.                 if ($v[$key[0]] == $key[1]) {  
  117.                     $this->data[$k][$value[0]] = $value[1];  
  118.                 }  
  119.             }  
  120.         }  
  121.           
  122.         return $this;  
  123.     }  
  124.       
  125.     /** 
  126.      * 删除并清空指定项 
  127.      * @param $key 删除项名 
  128.      * @return null 
  129.      */  
  130.     public function delete($key) {  
  131.         unset($this->data[$key]);  
  132.           
  133.         return $this;  
  134.     }  
  135.       
  136.     /** 
  137.      * 保存配置文件 
  138.      * @param $file 要保存的数据文件 
  139.      * @return true-成功 其它-保存失败原因 
  140.      */  
  141.     public function save() {  
  142.         if(defined('JSON_PRETTY_PRINT')) {  
  143.             $jsonStr = json_encode($this->data, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);  
  144.         } else {  
  145.             $jsonStr = json_encode($this->data);  
  146.         }  
  147.           
  148.         // 含有二进制或非utf8字符串对应检测  
  149.         if(is_null($jsonStr)) return '数据文件有误';  
  150.         $buffer = CONFIG_EXIT.$jsonStr;  
  151.           
  152.         $file_strm = fopen($this->file, 'w');  
  153.         if(!$file_strmreturn '写入文件失败,请赋予 '.$file.' 文件写权限!';  
  154.         fwrite($file_strm$buffer);  
  155.         fclose($file_strm);  
  156.         return true;  
  157.     }  
  158. }  

打赏
发表评论
表情 图片 链接 代码

  1. 邵先森
    邵先森 Lv 1

    影视呢 影视呢为啥子找不到嘞

  2. 很淡很淡的伤
    很淡很淡的伤 Lv 1

    $this->data[$key] = $value;
    这句代码很有问题.......
    折腾了我2个多小时,保存的时候总是丢失数据,排查了半天 各种测试啊...
    原来是因为保存time() 时间戳的时候 这个居然直接保存的是整数型..然后..它不会增加"" 双引号到配置文件里....然后其他的项就会丢失...比如username或者password 就直接保存配置的时候空白了

    ==============解决办法=============将所有值定义为字符串
    $this->data[$key] = strval($value);

    这个东西确实方便..希望孟坤有时间再完善下...我连个php新手都算不上,,实在没能力解决
    上面发的一条留言(第8条) 希望坤坤有时间测试下[可怜]

    • mengkun
      mengkun 站长

      @很淡很淡的伤在配置文件中存储直接的数字本身就是不需要加双引号的啊……你能提供一下出问题的相关代码么。

      • 很淡很淡的伤
        很淡很淡的伤 Lv 1

        @mengkun

        测试环境apche+php7.0
        <?php
        require_once 'Config.class.php'; 
        date_default_timezone_set('PRC');
        $C = new Config('config');
        $cookie_time=time();
        $username='123456';
        $password='789123';
        $C->set('u',$username);
        $C->set('p',$password);
        $C->set('time',$cookie_time); 
        //这里的情况保存time之后直接是一串数字不带""在配置文件里会导致 username和password的值保存不进去 为空白
        $C->save(); 
        ?>
      • mengkun
        mengkun 站长

        @很淡很淡的伤此代码 Nginx PHP5.4/PHP7.0 测试均正常……

      • 很淡很淡的伤
        很淡很淡的伤 Lv 1

        @mengkun习惯 我这次测试也正常了 不知道是因为什么原因了...[aru_1] 我之前那种出错之后用strval()把存储的数据转到字符串就好了...

  3. 很淡很淡的伤
    很淡很淡的伤 Lv 1

    经过测试, 如之前已经存放了的数据之后 如何再单独的 对数组里单条数据进行修改操作呢?
    例:config里已经有了数值

    user数组下的'name'=>'peter', 'age'=>12
    我要单独修改name的值 用下面的代码会全部覆盖掉之前的代码
    $C->set('user', array('name'=>'peter));
    变成只有 name=peter了 之前的age就没了...
    但是如果用单独的读写去操作的话$C->set('name',"用户名")
    它会单独的创一个name单条数据

    明明可以读一次文件获取变量 却要读N次....
    哎 不知道是不是操作手法有问题啊

    • mengkun
      mengkun 站长

      @很淡很淡的伤这个本来就是这么设计的。如果需要单改变存储的数组中的一项,可以这样:

      $user = $C->get('user');
      $user['name'] = 'newname';
      $C->set('user', $user);
  4. 萧长风
    萧长风 Lv 1

    我现在不知道该怎么用,新建Config.class.php好了,然后怎么在html里面调用呢

  5. 时光斑驳
    时光斑驳 Lv 1

    您好,您的故事影院的网站源码能发给我吗?买也行

  6. 阿珏
    阿珏 Lv 1

    看起来很有b格的样子[aru_67]

  7. 萧长风
    萧长风 Lv 1

    但是如果遇见了就像Typecho之类的博客程序要求用数据库地址,是不是就不能用这个了。
    那GitHub和coding上能用吗

    • mengkun
      mengkun 站长

      @萧长风这个只适用于少量数据。像typecho之类的既然已经用到了数据库就没必要用这个了。
      GitHub和coding的页面似乎无法运行php吧?用不了

  8. 完美者
    完美者 Lv 4

    没心情

  9. 燎原
    燎原 Lv 2

    好像很屌,沙发

  10. 小博
    小博 Lv 1

    看不懂,,

分享
微信
微博
QQ