GatewayWorker框架下 怎么能引用.env 配置文件呢

smile1

问题描述

GatewayWorker框架下 怎么能引用.env 配置文件呢

为此你搜索到了哪些方案及不适用的原因

看了下webman有 但是没找到GatewayWorker的

1207 3 0
3个回答

nitron

自己建一个

  • 暂无评论
admin

参考:thinkphp6的env

/app/Env.php

<?php

namespace app;

class Env
{
    /**
     * 环境变量数据
     * @var array
     */
    protected static $data = [];

    /**
     * 读取环境变量定义文件
     * @access public
     * @param  string    $file  环境变量定义文件
     * @return void
     */
    public static function load($file)
    {
        self::set($_ENV);
        if(!is_file($file)){
            return;
        }
        $env = parse_ini_file($file, true);
        self::set($env);
        self::set(\getenv());
    }

    /**
     * 获取环境变量值
     * @access public
     * @param  string    $name 环境变量名
     * @param  mixed     $default  默认值
     */
    public static function get($name=null, $default = null)
    {
        if($name==null){
            return self::$data;
        }
        $name=strtoupper($name);
        $name = strtoupper(str_replace('.', '_', $name));
        if (isset(self::$data[$name])) {
            return  self::$data[$name];
        }
        return $default;
    }

    /**
     * 设置环境变量值
     * @access public
     * @param  string|array  $env   环境变量
     * @param  mixed         $value  值
     * @return void
     */
    public static function set($env, $value = null)
    {

        if (is_array($env)) {
            $env = array_change_key_case($env, CASE_UPPER);
            foreach ($env as $key => $val) {
                if (is_array($val)) {
                    foreach ($val as $k => $v) {
                        self::$data[$key . '_' . strtoupper($k)] = trim($v);
                    }
                } else {
                    self::$data[$key] = trim($val);
                }
            }
        } else {
            $name = strtoupper(str_replace('.', '_', $env));
            self::$data[$name] = trim($value);
        }
    }
}

/start.php

<?php
use Workerman\Worker;
ini_set('display_errors', 'on');
require_once __DIR__ . '/vendor/autoload.php';

if (method_exists(\app\Env::class, 'load')) {
    $loadfile=file_exists(__DIR__.DIRECTORY_SEPARATOR.'dev.env')?'dev.env':'.env';
    \app\Env::load($loadfile);
}

如何使用?

读取env的 的某个字段
App_SecretKey=123456

// bussinessWorker 进程
$worker = new BusinessWorker();
$worker->secretKey = Env::get('App.SecretKey', null);
powerbowen

自己搞个包或者自己写一个

$envPath = '.env';
if(!file_exists($envPath))throw new \Exception("env is not set.");global $_ENV;$_ENV=parse_ini_file($envPath);function env($name) {global $_ENV;return isset($_ENV[$name]) ? $_ENV[$name] : null;}
var_dump(env('xxx'));
  • smile1 2022-12-08

    感谢 大佬

  • smile1 2022-12-08

    想请教下 这种一般在哪里进行初始化呢, 是否需要配置自动加载

  • powerbowen 2022-12-08

    不是大佬,我是放在入口文件里,然后就都能用了

年代过于久远,无法发表回答
×
🔝