新版webman,取消env的原因是什么?

evilk

新版的webman,没有了env
1.取消的原因是什么?
2.取消后,如何区分 不同环境 的配置?

阅读 616
2个回答

walkor

https://github.com/vlucas/phpdotenv/issues/410
https://github.com/walkor/webman/issues/200
主要是有用户发现 phpdotenv 在多线程环境下有bug。

另外的原因是想让webman内核更精简,只提供必要的 http协议解析、路由、中间件、日志等功能。
其他如数据库、redis、包括phpdotenv等等其他功能由开发者决定是否安装,以及安装哪个。这样的好处是可以更好复用php现有composer生态,也能避免webman内核因为功能过多版本更新时产生较大变动导致无法向下兼容。

虽然webman去掉了phpdotenv,但是你仍然可以通过 composer require vlucas/phpdotenv 安装它,安装后使用getenv() 函数就可以获取配置了。

区分环境有多种方案,比如配置文件不提交到版本库,版本库里只提供exapmle.xxx.php的样本配置文件。新项目根据样本配置。这样的好处是更新时不会因为环境导致配置冲突或者配置推送到错误的环境。

  • zeus 2021-11-16

    我们就是想根据配置的环境,比如dev|test|prod,来判断取得对应环境的配置参数,就可以了。还是希望官方能指定一个大家公用比较多的配置组件,谢谢大佬了。

adminv

这是thinkphp的env的写法,我改了下,可以用到webman里,而且$_ENV是二进制安全的,

<?php

namespace captain\webman;

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

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

    /**
     * 获取环境变量值
     * @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)] = $v;
                    }
                } else {
                    self::$data[$key] = $val;
                }
            }
        } else {
            $name = strtoupper(str_replace('.', '_', $env));
            self::$data[$name] = $value;
        }
    }
}

用法,支持数组标记(实际上会把 . 都转换为_)

##############CORE##################
[app]
debug=1
#进程数量
count=1
server_addr=http://0.0.0.0:8080
session_drive=file

Env::get('app.count',cpu_count() * 2)

  • 暂无评论