缘由
起因
最近遇到了南方电信idc访问北方redis从库速度慢的情况,公司动态平台无法根据南北机房配置不同的redis环境变量,所以由领导决定,直接采用动态平台默认提供的memcache服务器进行缓存配置。
Laravel
Laravel做配置缓存相对简单,运行php artisan config:cache
就可以生成一个config_cache.php
的文件,里面包含需要的所有配置信息,所以线上发布的时候,我们会在线下生成缓存文件,然后上传分发到动态平台的前端机。
Memcached变量
动态平台前端机在fpm的配置文件中给予了变量SINASRV_MEMCACHED_SERVERS
,使用$_SERVER["SINASRV_MEMCACHED_SERVERS"]
可以获取单台机器的配置,大抵是这个样子:10.13.32.21:7801 10.13.32.22:7801 10.13.32.105:7801
。
坑1
Laravel中Memcache缓存配置是类似一个数组的样子,如下:
我们这里需要的配置项是需要从$_SERVER
变量中动态获取的,每个机房的值不可控。
由于配置文件最终走的是我们缓存的config_cache.php
文件,该文件是框架生成缓存之后使用函数var_export
导出来的,所以考虑这里使用一个对象进行缓存。
类需要实现__set_state
静态方法,并且返回值类似原始配置中的数组样式,最终的代码如下所示:
由于框架中对memcache缓存的配置项加载时强制了array
,所以需要对此处进行修改:
如此,动态加载配置项就完成了。
正式环境上线后没遇到问题,此时放心地回家了。
坑2
今天上午在测试环境代码的时候,出现了新的问题:
经过google查询,看到了一篇相关的文章(可能要翻墙)
然后重新编译了memcached扩展,重启fpm,一切搞定。