上篇文章已经讲解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的常驻内存性框架,可以直接忽略,遍历文件批量获取即可。
最近在公司开发一个新的项目假设项目域名是a.com,需要接入b.com的单点登陆系统。(1).首先我们会在a.com的登陆页面用iframe引入b.com来显示登陆界面,实际上登陆验证操作都是在b.com上面(2).当b.com验证通过,会在前端ajax请求a.com的回调地址,这个回调地址目的就是...
posix_ttyname - 获取当前终端设备名称。<?php var_dump( posix_ttyname(STDOUT) );我们启动一个终端,执行上面的代码输出:/dev/tty1我们再启动一个终端,执行上面的代码输...
文章篇幅较长,如果不喜欢看文章的,此处抛出韩顺丰老师的位运算视频,韩老师应该是全网讲php位运算符最详细的一个老师了。链接:https://pan.baidu.com/s/14xj7er8eVSUcJ-jYXyA0GA 提取码:731m 链接:https://pan.baidu.com...
本教程使用的定时任务基于EasyTak,EasyTask官方文档:https://gitee.com/392223903/EasyTask由于tp3.2.x官方开发未考虑命令行支持和绝对路径开发的标准,因此我编写了一个支持的类来运行。1.在tp3.2.3根目录下安装easytaskcomposer&...
在调用微信code换openid的接口curl报错curl Received HTTP code 403 from proxy after CONNECT,错误码56。可以看到是curl的代理有问题。然后我自己电脑设置代理去访问curl请求的地址,的确也返回了403,说明代理不允许访问这个地址,联系...
【一】.无锁场景:多个人购买一件商品,库存减少。商品表:主键 商品名 库存数量 id name stock 1&nb...