应用配置

    目录

    配置分为:环境变量项目配置服务器配置

    环境变量 是通过环境变量指定的配置,一般是在框架加载完成前就要使用的配置,会采用环境变量的形式。

    项目配置 是一些公共的配置,会影响整个项目。

    服务器配置 是针对指定服务器,比如你写的某个 Http 服务的一些特别配置,可以在里面配置一些服务器相关的设置。

    imi 还支持你在项目根目录下,建立一个.env文件,在里面设置运行环境配置。

    环境变量

    变量名称描述默认值
    IMI_MACRO_OUTPUT_DIR宏定义文件处理后的输出目录,生成文件名格式:md5(原文件完成路径).php空字符串
    IMI_MACRO_LOCK_FILE_DIR宏定义文件锁目录。当项目文件放置在,共享目录等不支持文件锁的文件系统时,可以配置一个支持文件锁的目录。比如:/tmp空字符串
    • 环境变量可以配置在系统中
    • 也可以在运行命令时指定:IMI_MACRO_LOCK_FILE_DIR=/tmp vendor/bin/imi-swoole swoole/start

    配置文件结构

    共有结构

    <?php
    return [
        // 项目命名空间,即将在 imi 3.0 废弃,改为 composer.json 中配置,详见下文
        'namespace' => 'ImiApp',
    
        // 加载子配置文件,可以使用 \Imi\Config::get('@app.别名1.xxx') 获取
        'configs'    =>    [
            "别名1"    =>    '配置文件路径1',
            "别名2"    =>    '配置文件路径2',
            ……
        ],
    
        // 如果配置了 configs.别名1,这里的值会被上面的文件覆盖
        '别名1' => [],
    
        // bean扫描目录,指定命名空间,建议省略
        // 'beanScan'    =>    [
        //     'ImiDemo\WebSocketDemo\Listener',
        // ],
    
        // 日志配置,详见日志文档
        'logger' => [],
    
        // imi 核心配置,一般可以省略
        'imi' => [
            // 运行时缓存配置
            'runtime' => [
                // --- bean 相关缓存开始 ---
                'bean' => true, // 启用 bean 相关缓存,如果为false,则下面的配置无效
                'annotation_parser_data' => true, // 处理器存储数据缓存
                'annotation_parser_parsers' => true, // 处理器数据缓存
                'annotation_manager_annotations' => true, // 注解缓存
                'annotation_manager_annotation_relation' => true, // 注解关联缓存
                'partial' => true, // partial 缓存
                // --- bean 相关缓存结束 ---
    
                'cli' => true, // 命令行缓存
                'route' => true, // 路由缓存
                'enum' => true, // 枚举类缓存
                'event' => true, // 事件缓存
    
                // swoole 相关
                'swoole' => [
                    'process' => true, // 进程缓存
                ],
    
                // workerman 相关
                'workerman' => [
                    'process' => true, // 进程缓存
                ]
            ],
            'Timer' => '', // 定时器类名,详见定时器文档
            // 服务器容器绑定
            'beans' => [
                'ServerUtil' => '', // 服务器工具类类名,详见服务器工具类文档
                // 其它自定义
                'aaa' => XXX::class,
            ],
            // ide 助手文件生成
            'ideHelper' => null, // 是否生成IDE助手文件,如果为`null`则依据`App::isDebug()`决定
        ],
    
        // 统一的服务器配置
        'server' => [
            // 启动服务时,检查连接池连接或非连接池连接是否可用。如不可用直接退出程序。
            'checkPoolResource' => false,
        ],
    ];

    Swoole 项目配置文件

    return [
        // 忽略扫描的命名空间
        'ignoreNamespace'   =>  [
            'Imi\Test\Component\Annotation\A\*',    // 忽略扫描该命名空间下所有类
            'Imi\Test\Component\Annotation\B\TestB',// 忽略该类
        ],
        // 全局忽略扫描的目录
        'ignorePaths' => [
            '绝对路径,可包含通配符*',
        ],
        // 仅扫描项目时忽略扫描的目录
        'appIgnorePaths' => [
            '绝对路径,可包含通配符*',
        ],
        // Swoole >= 4.1.0可用,不设置默认为true,开启一键协程化
        'enableCoroutine'    =>    true,
        // runtime目录设置,默认可不设置,为当前项目下的.runtime目录
        // 注意,多个项目不可设置为相同目录!
        'runtimePath'   =>  '/tmp/imidemo-runtime/',
        // 定义进程名规则
        'process'   =>  [
            'master'        =>  'imi:master:{namespace}',
            'manager'       =>  'imi:manager:{namespace}',
            'worker'        =>  'imi:worker-{workerId}:{namespace}',
            'taskWorker'    =>  'imi:taskWorker-{workerId}:{namespace}',
            'process'       =>  'imi:process-{processName}:{namespace}',
            'processPool'   =>  'imi:process-pool-{processPoolName}-{workerId}:{namespace}',
            'tool'          =>  'imi:{toolName}/{toolOperation}:{namespace}',
        ],
        // 主服务器配置
        'mainServer'    =>    [
            // 指定服务器命名空间
            'namespace'    =>    'ImiDemo\HttpDemo\MainServer',
            // 服务器类型(http/WebSocket/TcpServer/UdpServer)
            'type'        =>    \Imi\Swoole\Server\Type::HTTP,
            // 监听的IP地址,可选
            'host'        =>    '0.0.0.0',
            // 监听的端口
            'port'        =>    8080,
            // 参考 swoole mode,可选
            'mode'        =>    SWOOLE_BASE,
            // 参考 swoole sockType,可选
            'sockType'    =>    SWOOLE_SOCK_TCP,
            // 同步连接,当连接事件执行完后,才执行 receive 事件。仅 TCP、WebSocket 且 SWOOLE_BASE 模式有效
            'syncConnect' => true,
            // 服务器配置,参数用法同\Swoole\Server->set($configs)
            // 参考: http://wiki.swoole.com/#/server/setting
            // 参考: http://wiki.swoole.com/#/websocket_server?id=%e9%80%89%e9%a1%b9
            // 参考: http://wiki.swoole.com/#/http_server?id=%e9%85%8d%e7%bd%ae%e9%80%89%e9%a1%b9
            'nonControlFrameType' => \Imi\Server\WebSocket\Enum\NonControlFrameType::TEXT, // 配置 WebSocket 纯文本通信协议
            // 'nonControlFrameType' => \Imi\Server\WebSocket\Enum\NonControlFrameType::BINARY, // 配置 WebSocket 二进制通信协议
            'configs'    =>    [
                'reactor_num'        => 8,
                'worker_num'        => 8,
                'task_worker_num'    => 16,
                // Swoole 错误日志文件。如果不设置或为null则自动记录到 .runtime/swoole/swoole.log。如果设为 false 不记录 Swoole 错误日志。
                // 'log_file' => '',
            ],
            // 服务器容器绑定
            'beans' => [
                'aaa' => XXX::class,
            ],
        ],
        // 子服务器(端口监听)配置
        'subServers'    =>    [
            // 子服务器别名
            'alias1'    =>    [
                // 这里同主服务器配置
            ]
        ],
    ];

    Workerman 项目配置文件

    return [
        // 忽略扫描的命名空间
        'ignoreNamespace'   =>  [
            'Imi\Test\Component\Annotation\A\*',    // 忽略扫描该命名空间下所有类
            'Imi\Test\Component\Annotation\B\TestB',// 忽略该类
        ],
        // 全局忽略扫描的目录
        'ignorePaths' => [
            '绝对路径,可包含通配符*',
        ],
        // 仅扫描项目时忽略扫描的目录
        'appIgnorePaths' => [
            '绝对路径,可包含通配符*',
        ],
        // runtime目录设置,默认可不设置,为当前项目下的.runtime目录
        // 注意,多个项目不可设置为相同目录!
        'runtimePath'   =>  '/tmp/imidemo-runtime/',
        // Workerman 服务器配置
        'workermanServer' => [
            // 服务器名
            'http' => [
                // 指定服务器命名空间
                'namespace' => 'Imi\Workerman\Test\HttpServer\ApiServer',
                // 服务器类型
                'type'      => Imi\Workerman\Server\Type::HTTP, // HTTP、WEBSOCKET、TCP、UDP
                'host'      => '0.0.0.0',
                'port'      => 8080,
                // socket的上下文选项,参考:http://doc3.workerman.net/315128
                'context'   => [],
                'configs'   => [
                    // 支持设置 Workerman 参数
                ],
                // 服务器容器绑定
                'beans' => [
                    'aaa' => XXX::class,
                ],
            ],
        ],
        'workerman' => [
            // 设置给 Worker 类静态属性的配置
            'worker' => [
                
            ],
        ],
    ];

    PHP-FPM 项目配置文件

    [
        // 忽略扫描的命名空间
        'ignoreNamespace'   =>  [
            'ImiApp\public\*', // 忽略 public 目录
            'Imi\Test\Component\Annotation\A\*',    // 忽略扫描该命名空间下所有类
            'Imi\Test\Component\Annotation\B\TestB',// 忽略该类
        ],
        // 全局忽略扫描的目录
        'ignorePaths' => [
            '绝对路径,可包含通配符*',
        ],
        // 仅扫描项目时忽略扫描的目录
        'appIgnorePaths' => [
            '绝对路径,可包含通配符*',
        ],
        'fpm' => [
            'serverPath' => '如果兼容 Swoole、Workerman 服务器子目录,则设置一下该目录路径',
        ],
    ]

    .env

    .env 中的配置方式,支持两种写法。

    写法一:直接注入配置,和Config::set()写法类似,支持@app等写法。

    写法二:传统方式,如设定一个ABC=123,在配置文件中:

    use function Imi\env;
    
    use Imi\Env;
    
    return [
        'abc1'   =>  env('ABC', 'default'), // imi 框架封装,支持第二个参数为默认值
        'abc2'   =>  Env::get('ABC', 'default'), // imi 框架封装,支持第二个参数为默认值
        'abc3'   =>  getenv('ABC'), // PHP 内置
        'abc3'   =>  $_ENV['ABC'] ?? null, // PHP 内置
    ];

    更多写法:

    • env:
    A=123
    B=0
    C=1,2,3
    D=[4, 5, 6]
    E=imi
    BOOL_TRUE=true
    BOOL_FALSE=false
    NULL_VALUE=null
    EMPTY_VALUE=
    • php:
    use Imi\Env;
    use function Imi\env;
    
    // Imi\env() 同 Imi\env::get()
    env('A'); // 123
    env('E'); // imi
    env('A', 'default'); // '123'
    env('A', 0); // 123
    env('A', 3.14); // 123.0
    env('A', false); // '123'
    env('B', false); // false
    env('BOOL_TRUE', false); // true
    env('BOOL_FALSE', false); // false
    env('C', []); // ['1', '2', '3']
    env('D', []); // ['4', '5', '6']
    env('NULL_VALUE'); // null
    env('NULL_VALUE', 666); // null
    
    Env::str('A'); // '123'
    Env::int('A'); // 123
    Env::int('E'); // 抛出异常
    Env::int('NULL_VALUE'); // null
    Env::float('A'); // 123.0
    Env::float('E'); // 抛出异常
    Env::float('NULL_VALUE'); // null
    Env::bool('A'); // 抛出异常
    Env::bool('B'); // false
    Env::bool('bool_TRUE'); // true
    Env::bool('bool_FALSE'); // false
    Env::bool('E'); // 抛出异常
    Env::bool('NULL_VALUE'); // null
    Env::json('D'); // ['4', '5', '6']
    Env::json('NULL_VALUE'); // null
    Env::json('EMPTY_VALUE'); // 抛出异常
    Env::list('C'); // ['1', '2', '3']
    Env::list('NULL_VALUE'); // null
    Env::list('EMPTY_VALUE'); // 抛出异常

    如下,是设置连接池的uri例子:

    @app.pools.maindb.async.resource = "tcp://192.168.0.222/?username=root&password=root&database=db_test&timeout=60"

    数组的支持:

    @app.a.0.id = 1
    @app.a.0.name = name1
    @app.a.1.id = 2
    @app.a.1.name = name2

    同:

    [
        'a' =>  [
            ['id'=>1, 'name'=>'name1'],
            ['id'=>2, 'name'=>'name2'],
        ]
    ]

    自定义项目目录

    通常情况下,框架会自动识别项目目录。但在一些场景,你也可以自己定义项目目录。

    在入口文件定义:

    \Imi\App::set(\Imi\AppContexts::APP_PATH, '项目目录', true); // phar 模式下不是物理目录
    \Imi\App::set(\Imi\AppContexts::APP_PATH_PHYSICS, '项目物理目录', true);

    在项目里,无论你是否定义,都可以使用下面的方法,获取到项目目录:

    \Imi\App::get(\Imi\AppContexts::APP_PATH); // phar 模式下不是物理目录
    \Imi\App::get(\Imi\AppContexts::APP_PATH_PHYSICS);

    composer.json

    composer.json 中,我们允许配置一些优先于项目及框架加载前的配置。

    在项目启动时,会在项目目录下生成 imi.cache 文件,如果修改了 composer.jsonimi 相关配置,需要手动删除 imi.cache 文件才可生效!

    格式如下:

    {
        "imi": {
            // 项目命名空间
            "namespace": "ImiApp"
        }
    }
    复制粘贴到 composer.json 注意删除注释