上篇文章已经讲解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的常驻内存性框架,可以直接忽略,遍历文件批量获取即可。
先看看下面的代码:<?php session_start(); $_SESSION['username']='lucy'; ?>当我们请求访问上面的脚本,默认会在我们的客户端生成一个名为PHPSESSID的cookie,我这里的值是PHPSESSID=...
//$ak开发密钥,$cityname城市名称(支持省县乡详细地址) public function getposition($ak,$cityname){ $callback=array('lng'=>0,'l...
源码:特别适用于微信支付中通知微信支付网关function array2xml($arr, $level = 1) { $s = $level == 1 ? "<xml&g...
如果想在windows中执行php,并且让php脚本在后台运行,可以用下面的cmd命令start /b php D:\wwwroot\default\demo1\run.php例如上面的命令意思后台运行run.php,如果想用php编写异步代码: ...
(1).在PHP中可以查看的环境变量包括: (1.1).电脑环境变量 (2.1).服务器环境变量(2).getenv()函数获取一个环境变量的值.参数1是环境变量的key,参数2值为true的时候仅从你的电脑环境变量中查找,参数2值为false会从两种变量中全部查询//获取我电脑登录的用户名,输出A...
(1)swoole启动的主进程是master进程负责全局管理,然后master进程会再fork一个manager进程。(2)manager进程开始统一管理进程创建回收管理。(3)manager进程根据设置的worker_num和task_worker_num来创建work进程和task进程因此启动s...