当前位置:首页 > PHP > 正文内容

php arrayaccess的应用场景:配置管理器

高老师7年前 (2018-12-25)PHP1652

上篇文章已经讲解arrayacces的原理,现在来讲解下arrayaccess的实际应用。

一个大型的互联网项目中必然会存在各种配置信息,例如多种数据库信息:mysql,tidb,mongodb,redis,某个业务模块单独的配置信息如比例,额度等等,那么该如何治理配置信息?

PHP项目中大部分的框架都是通过数组来保存配置信息,比如微擎在data.php中囊括了全局所有的配置项。实际上微擎的这种方式是不可取的,随着项目越来越大,配置项越来越多,但是并非每次请求的业务都需要用到配置信息,造成多余的内存占用。理想的配置管理应该是按需加载。

例如在我的框架下存在一个config文件夹,其中包含db.php,rpc.php,文件内容如下:

(1).db.php

<?php
return [
    'mysql' => [
        'host' => '127.0.0.1',
        'port' => '3306',
        'user' => 'root',
        'pass' => 'root',
        'dbname' => 'dnet'
    ],
    'redis' => [
        'host' => '127.0.0.1',
        'port' => '6379'
    ],
];

(2).rpc.php

<?php
return [
    'default' => [
        'ip' => '127.0.0.1',
        'port' => 8199,
        'pools' => 10,
        'local' => true,
    ],
    'order' => [
        'ip' => '127.0.0.1',
        'port' => 8199,
        'pools' => 10,
        'local' => true,
    ]
];

当然随着项目的扩展,config文件夹会存在一堆这样的配置文件,通过我的配置管理器即可做到按需加载。代码如下:

<?php

/**
 * 配置管理器
 * Class Configer
 */
class Configer implements ArrayAccess
{
    /**
     * 配置文件目录
     */
    private $path;

    /**
     * 配置集合
     * @var array
     */
    private $config = [];

    /**
     * 配置实例
     * @var
     */
    private static $instance;

    /**
     * 初始化配置目录
     * Configer constructor.
     */
    public function __construct()
    {
        $this->path = __DIR__ . '/config/';
    }

    /**
     * 配置器单件实例
     */
    public static function instance()
    {
        if (!(self::$instance instanceof Configer))
        {
            self::$instance = new Configer();
        }
        return self::$instance;
    }

    /**
     * 检查指定的Key是否存在
     * @param mixed $offset
     * @return bool
     */
    public function offsetExists($offset)
    {
        return isset($this->config[$offset]);
    }

    /**
     * 获取指定的Key值
     * @param mixed $offset
     * @return mixed
     */
    public function offsetGet($offset)
    {
        if (empty($this->config[$offset]))
        {
            $this->config[$offset] = require $this->path . $offset . '.php';
        }
        return $this->config[$offset];
    }

    /**
     * 重新设置某个Key的值
     * @param mixed $offset
     * @param mixed $value
     * @throws Exception
     */
    public function offsetSet($offset, $value)
    {
        var_dump($offset);

        $this->config[$offset] = $value;
    }

    /**
     * 销毁某个Key的值
     * @param mixed $offset
     */
    public function offsetUnset($offset)
    {


        if (isset($this->config[$offset]))
        {
            $this->config[$offset] = null;
        }
    }

}

//初始化配置器
$configer = Configer::instance();

//获取DB配置信息
//var_dump($configer['db']['mysql']);
//var_dump($configer['db']['redis']);

//获取RPC配置信息
//var_dump($configer['rpc']['order']);

在fpm框架中按需加载的确很重要,但如果是基于swoole的常驻内存性框架,可以直接忽略,遍历文件批量获取即可。

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/73.html

分享给朋友:

“php arrayaccess的应用场景:配置管理器” 的相关文章

php经纬度计算距离

php经纬度计算距离

/**  * 计算两点地理坐标之间的距离  * @param  Decimal $longitude1 起点经度  * @param  Decimal $lati...

 php header属性,php header 详解,php header的作用

php header属性,php header 详解,php header的作用

header() 函数向客户端发送原始的 HTTP 报头。(官方解释)通俗的讲header函数将参数中的字符串作为服务端的响应头来返回给客户端。什么是服务端的响应头?打开谷歌浏览器看看network中的请求response header信息即可。更多的参数百度response header即可浏览器...

全方位认识PHP的SESSION

全方位认识PHP的SESSION

【一】.介绍session由于HTTP是无状态的请求,创建一个会话需要保持必须需要身份标识。当用户第一次访问,PHP会为用户创建一个唯一的sessionid,并将sessionid通过cookie发送给浏览器,并在服务器的临时文件创建一个以sessionid为名的文件用来保存这个sessionid保...

packagist包发布稳定版

packagist包发布稳定版

自己的composer已经发布到packagist,但是无法使用composer require easy-task/easy-task来安装,只能在配置文件使用如下方式安装:"require": {     "easy...

php redis事务

php redis事务

概念请参考w3school文章: redis watch ,redis exec (看完基本秒懂)(1)基本事务://连接本地的 Redis 服务 $redis = new Redis(); $redis->con...