webman官方可否指定一个env切换环境的组件呢?

zeus

https://wenda.workerman.net/question/7503
https://wenda.workerman.net/question/7534

现在开发项目确实需要一个切换环境的组件,希望大佬能安排下。谢谢。

阅读 840
7个回答

walkor

这个就几行代码,感觉用不着什么组件

1、config/下建立个 .env 文件,内容类似

return [
    'DB_HOST' => '这写数据库地址',
    'DB_PASSWORD' => '这里写密码'
];

2、support/helper.php 里添加一个函数比如

function env($key, $default = null) {
    static $env_config = [];
    if (!$env_config) {
        $env_config = include config_path().'/.env';
    }
    return $env_config[$key]??$default;
}

3、使用时类似这样,比如config/mysql.php

return [
    'default' => 'mysql',
    'connections' => [
        'mysql' => [
            'type'        => 'mysql',
            'hostname'    => env('DB_HOST', '127.0.0.1'),
            'database'    => 'workerman_net',
            'username'    => 'root',
            'password'    => env('DB_PASSWORD', '1234456'),
            'hostport'    => '3306',
        ],
    ],
];

注意 config/.env 不提交到版本库(.gitignore里加一行config/.env),然后项目根据环境设置config/.env内容就行了

  • zeus 2021-11-18

    谢谢老哥。太感谢了。

zeus

根据老哥的代码实操了一下。 除了env函数名重复改了个名字 envs() ,其他没问题。 感谢老哥了。

  • 暂无评论
zeus

具体实现如下:
helper.php

/**
 * envs环境参数获取
 * @param $key
 * @param null $default
 * @return mixed|null
 */
function envs($key, $default = null)
{
    static $env_config = [];
    if (!$env_config) {
        $env_config = include base_path() . DIRECTORY_SEPARATOR . '.env.php';
    }
    return $env_config[$key] ?? $default;
}

.env.php

<?php

/*
|--------------------------------------------------------------------------
| app.php
|--------------------------------------------------------------------------
*/
$app = [
    'APP_NAME' => 'webman',
    'APP_ENV' => 'dev',
    'APP_DEBUG' => true,
];

/*
|--------------------------------------------------------------------------
| database.php
|--------------------------------------------------------------------------
*/
$mysql = [
    'DB_HOST' => '127.0.0.1',
    'DB_PORT' => 3306,
    'DB_USER' => 'root',
    'DB_PASSWORD' => 'root',
];

return array_merge($app, $mysql);

database.php

return [
    // 默认数据库
    'default' => 'mysql',

    // 各种数据库配置
    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'host' => envs("DB_HOST", '127.0.0.1'),
            'port' => envs("DB_PORT", 3306),
            'database' => 'test',
            'username' => envs('DB_USER', 'root'),
            'password' => envs('DB_PASSWORD', 'root'),
            'unix_socket' => '',
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
  • 暂无评论
evilk

mark一下

  • 暂无评论
Tinywan

学习了

  • 暂无评论
10bang

学习了

  • 暂无评论
Maoxp

可以模仿VUE 的环境分 .env .env.development .env.proudction
根据 .env 中的 WENMAN_ENV='development' 决定 是开发还是生产

.env

WENMAN_ENV='development'

APP_DEBUG=true

SERVER_PROCESS_GROUP=''
SERVER_PROCESS_USER=''

SESSION_DRIVER=file

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=root
DB_PASSWORD=123456

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

.env.development

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=root
DB_PASSWORD='tech'

REDIS_HOST=223.3445.322
REDIS_PASSWORD='m@redis'
REDIS_PORT=5769
REDIS_DATABASE=1

SERVER_LISTEN= 'http://0.0.0.0:8787'
SERVER_NAME= 'WMS'
SERVER_COUNT= 8

development 或 production 的配置如果和env的重复,自动覆盖,唯一不好的就是需要在 start.php 中添加


if (file_exists(base_path().'/.env')) {
    // 解析env文件,name = PHP_KEY
    $env = parse_ini_file(base_path().'/.env', true);
    if (isset($env['WENMAN_ENV'])) {
        $_env = parse_ini_file(base_path().'/.env.'.$env['WENMAN_ENV'], true);
        $env = array_merge($env, $_env);
    }

    foreach ($env as $key => $val) {
        if (is_array($val)) {
            //如果是二维数组 item = PHP_KEY_KEY
            foreach ($val as $k => $v) {
                $item = $key . '_' . $k;
                putenv("$item=$v");
            }
        } else {
            putenv("$key=$val");
        }
    }
}
```php

然后写个function  获取env的配置,就可以在 config中使用了 。
```js
function cf_env($key, $default = null) {
        $value = getenv($key, true);

        if ($value === false) {
            return $default;
        }
    }
  • zeus 20天前

    挺好的。只是我这边没有推送到_ENV 中。