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

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

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

上篇文章已经讲解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 trait的使用

php trait的使用

PHP不像net支持多继承,自身只支持单继承,为了解决这个问题,php出了Trait这个特性,减少单继承语言的限制。并且能让代码复用率更高。说白了就是一个对象的属性和方法扩展工具一样。例如:trait exts {     public f...

redis订阅和发布,redis消息订阅与发布, phpredis订阅和发布

redis订阅和发布,redis消息订阅与发布, phpredis订阅和发布

Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者(publisher),订阅者(subscriber)和频道(channel)。 发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个...

PHP getenv函数和putenv函数的学习

PHP getenv函数和putenv函数的学习

(1).在PHP中可以查看的环境变量包括: (1.1).电脑环境变量 (2.1).服务器环境变量(2).getenv()函数获取一个环境变量的值.参数1是环境变量的key,参数2值为true的时候仅从你的电脑环境变量中查找,参数2值为false会从两种变量中全部查询//获取我电脑登录的用户名,输出A...

pcntl_signal(): Error assigning signal

pcntl_signal(): Error assigning signal

当我想在一个进程中监听kill 和 kill -9命令报了这个错误。//监听kill pcntl_signal(SIGTERM, function () {     posix_kill(0, SIGTERM); });...

 php命令行中文乱码,php cli中文乱码

php命令行中文乱码,php cli中文乱码

<?php //如果支持exec函数,可以使用的方式 exec('chcp 65001'); //如果exec函数因安全问题禁用,可以使用的方式 pclose(popen('chcp 65001', 'r'));...

PHP最快方式模拟curl,PHP最快爬虫模拟方法

PHP最快方式模拟curl,PHP最快爬虫模拟方法

有时候我们需要爬一个接口,但是这个接口需要很多参数,包括header和cookie要去编写,使用php curl模拟实在太慢。我们可以通过浏览器的network来复制请求为curl命令。例如我需要模拟请求接口地址:https://www.xkmz.cc/Ajax/Debug/delly,我们只需要在...