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

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

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

上篇文章已经讲解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高并发下数据库值更新的问题

(1).创建数据库test ,创建表shop(字段id,total),商品id是1,商品总数10    (2).PHP模拟购买,商品数量大于0才能购买<?php //连接数据库 $con=mysqli_connect("192.168.2.18...

php抽奖概率算法

php抽奖概率算法

<?php /*  *算法学习自百度.只是学习和记录  */ header("Content-type:text/html;charset=utf-8"); //1.设置奖项,id是奖项id,name是中奖名称,v是中奖概率 $arr =&n...

posix_ttyname函数详解

posix_ttyname函数详解

posix_ttyname - 获取当前终端设备名称。<?php     var_dump( posix_ttyname(STDOUT) );我们启动一个终端,执行上面的代码输出:/dev/tty1我们再启动一个终端,执行上面的代码输...

tp orm事务提交未执行的教训和总结

tp orm事务提交未执行的教训和总结

最近在项目中处理一个关于商品数据重复需要删除多余的商品记录,但是删除一条商品必然要把关联的其他表商品的id和其他商品信息更换为正确的,删除一个商品记录,同时要去修改100多张表的关联商品数据,在项目中引用了tp orm 1.2版本,由于项目是php5.6版本,没法使用最新orm,在代码中每处理1个商...

laravel定时任务,tp定时任务,thinkphp定时任务

laravel定时任务,tp定时任务,thinkphp定时任务

本文基于Laravel Framework 6.17.1版本(1).创建项目(依赖真多,如此臃肿)composer create-project --prefer-dist laravel/laravel blog(2).安装定时任务composer包&nbs...

EasyTask使用redis队列教程

EasyTask使用redis队列教程

场景:模拟验证码发送。仅做代码演示。(1).创建一个验证码发送接口sendCaptcha/**  * 发送验证码  */ public function sendCaptcha() {     //外部参数(获...