use Illuminate\Redis\RedisManager;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Facade;
app()->singleton('redis', function ($app) {
$config = $app->make('config')->get('database.redis');
return new RedisManager(Arr::pull($config, 'client', 'predis'), $config);
});
Facade::clearResolvedInstance('redis');
use Illuminate\Redis\Database;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Facade;
app()->singleton('redis', function ($app) {
return new Database($app['config']['database.redis']);
});
Facade::clearResolvedInstance('redis');
高认可度评论:
理解这个问题之前需楼主去补一波
ServiceProvider
的知识点了 :)问题的关键在于
Illuminate\Redis\RedisServiceProvider
:Laravel在启动
RedisServiceProvider
时,会将redis
作为一个单例注册在应用容器中,而生成单例的那一刻,redis
的所有配置已经作为一份拷贝定格在RedisManager
之中了,所以你后面动态填加的redis2
配置是没有效果的。(追踪源码一切就真相大白了^_^)那么你可能还会问,为什么我的
redis1
也是动态填加却效果呢?这是因为RedisServiceProvider
这个服务是一个延迟加载的服务(仔细观察他的$defer
属性是true
),延迟加载的意义就在于第一次使用时才去加载服务。在你的代码里redis1
配置是在第一次调用服务(26行)之前配置的,此时redis
单例还未生成,所以这个配置是有效的。希望能帮到你。
理解这个问题之前需楼主去补一波
ServiceProvider
的知识点了 :)问题的关键在于
Illuminate\Redis\RedisServiceProvider
:Laravel在启动
RedisServiceProvider
时,会将redis
作为一个单例注册在应用容器中,而生成单例的那一刻,redis
的所有配置已经作为一份拷贝定格在RedisManager
之中了,所以你后面动态填加的redis2
配置是没有效果的。(追踪源码一切就真相大白了^_^)那么你可能还会问,为什么我的
redis1
也是动态填加却效果呢?这是因为RedisServiceProvider
这个服务是一个延迟加载的服务(仔细观察他的$defer
属性是true
),延迟加载的意义就在于第一次使用时才去加载服务。在你的代码里redis1
配置是在第一次调用服务(26行)之前配置的,此时redis
单例还未生成,所以这个配置是有效的。希望能帮到你。
ServiceProvider
这个确实不了解, 看文档吗,还是有其他推荐的方法吗?那有什么办法让
redis
单例生成之后销毁尼, unset 没有作用?@coodeer@coodeer 因为是想从本地的
redis
读取其他 机器的redis
配置 ,再去connection
连接所以有什么办法可以销毁尼?
提供一条参考思路:修改配置后,重新绑定一次
redis
单例,然后清除Facade实例即可。(或许还有更好的方法)
@coodeer
"Class 'Illuminate\Redis\RedisManager' not found"
这是跟laravel 的版本有关吗?
@英雄没有斗篷
5.3及以前的版本换成
Illuminate\Redis\Database
应该就好了:@coodeer 可以了 , 非常感谢啊 ! 我自己完全不知道怎么弄
配置过 redis 哨兵模式吗?
@leung0826 这个没了解过