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

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

高老师6年前 (2018-12-25)PHP1536

上篇文章已经讲解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 max input vars,max input vars限制,max input vars 设置

php max input vars,max input vars限制,max input vars 设置

在一个正式项目中操作人员提交239个产品信息进行保存,但是系统却提示没有提交239个产品,于是开启错误信息,显示如下:Warning: Unknown: Input variables exceeded 1000. To incr...

【一】PHP多进程学习-简单创建父子进程.理解父子进程运行流程

【一】PHP多进程学习-简单创建父子进程.理解父子进程运行流程

(1).学习的目标:学会创建父子进程,并且能够区分当前进程是父还是子;了解父进程执行过程,子进程执行过程;能够用多进程执行任务(2).相关函数学习:    (2.1)pcntl_fork()执行时:       &nbs...

php守护进程

php守护进程

<?php /**  * daemonize让当前脚本为守护进程执行  * @param string $callback 匿名函数  */ function daemonize($callback) {...

php finally使用

php finally使用

<?php /**  * @throws Exception  */ function curl() {     throw  new \Exception('err...

php限制方法返回值类型

php限制方法返回值类型

php7新增的特性(1).强制限制只能返回一种类型<?php class task { } //must return an integer function add(): int {    &nb...

PHP Warning:  ftok(): Project identifier is invalid

PHP Warning: ftok(): Project identifier is invalid

在使用ftok生成ipc进程通信key尝试将第二个参数项目标识符传入字符串报错:PHP Warning:  ftok(): Project identifier is invalid,查阅资料发现第二个字符串只能是1个字符串,长度为1....