php - 在 Laravel 中用于本地和生产的单个 Redis 配置?

标签 php laravel redis

我正在尝试在 database.php 中设置单个 Redis 配置,以涵盖我在 Laravel (5.8) 中的本地和生产(Redis 集群)环境。

此配置适用于我的本地 (APP_ENV=local) Redis 实例:

'redis' => [

    'client' => 'predis',

    'default' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => 0,
    ],

],

这适用于我的产品 (APP_ENV=production) Redis 集群:

'redis' => [

    'client' => 'predis',

    'options' => [
        'cluster' => 'redis',
    ],

    'clusters' => [
        'default' => [
            [
                'host' => env('REDIS_HOST', 'localhost'),
                'password' => env('REDIS_PASSWORD', null),
                'port' => env('REDIS_PORT', 6379),
                'database' => 0,
            ],
        ],
    ],

],

我想设置一个配置,以便在设置 APP_ENV=local 时使用我的本地 Redis 实例并设置 APP_ENV=production 使用我的 Redis 集群。

我在我的 APP_ENV=production 环境中尝试了以下操作(REDIS_CLUSTER 设置为 true):

'redis' => [

    'client' => 'predis',

    'cluster' => env('REDIS_CLUSTER', false),

    'options' => [
        'cluster' => 'redis',
    ],

    'clusters' => [
        'default' => [
            [
                'host' => env('REDIS_HOST', 'localhost'),
                'password' => env('REDIS_PASSWORD', null),
                'port' => env('REDIS_PORT', 6379),
                'database' => 0,
            ],
        ],
    ],

    'default' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => 0,
    ],

],

但这失败了 MOVED错误。

我在 laracasts.com/discuss 上发布了一个问题但这让我更加困惑,因为它似乎建议我更新我的应用程序代码(而不是 database.php 中的 Redis 配置)以适应这两种环境。我觉得我在配置应该如何工作方面遗漏了一些明显的东西。

最佳答案

不确定这是实现此目的的最佳(或正确)方法,但我最终将以下逻辑放在了我的 database.php 文件的顶部:

<?php

if (env('APP_ENV') == 'production') {
    $redis =  [
        'client' => 'predis',
        'options' => [
            'cluster' => 'redis',
        ],
        'clusters' => [
            'default' => [
                [
                    'host' => env('REDIS_HOST', 'localhost'),
                    'password' => env('REDIS_PASSWORD', null),
                    'port' => env('REDIS_PORT', 6379),
                    'database' => 0,
                ],
            ],
        ],
    ];
}
else {
    $redis = [
        'client' => 'predis',
        'default' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
        ],
    ];
}

return [

....

并为我的 redis 键使用以下内容:

    'redis' => $redis

所以我的生产环境使用的是Redis集群配置,我的本地使用的是本地配置。

如果有人知道为什么上面有更好的方法

关于php - 在 Laravel 中用于本地和生产的单个 Redis 配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56902656/

相关文章:

php - 连接两个 MySQL 列并输出 colB.name,其中 colA.id 等于 colB.id

php - 通过引用将参数可移植地传递给 PHP 的 ReflectionMethod::invokeArgs

mysql - Laravel5 帮助构建查询语法

amazon-web-services - Sidekiq 统计数据神秘重置

node.js - 使用 laravel 和 redis 进行实时聊天

redis - 多个 Redis 数据库有什么意义?

php - 如何使用php调整表格中显示的图像的大小

php - 是否可以将 AngularJS、HTML5 和 CSS3 组合为前端,将 NodeJS 组合为后端,将 PHP5 组合为 rest web 服务?

php - Laravel 5.5 如何在 LaravelCollective 表单中使用 Foreach 循环

php - Laravel - 如何将参数传递给路由?有更好的做法吗?