PHP框架下配置文件读取k8s环境变量,实现node的custom-environment-variables效果
程序员文章站
2022-07-05 18:32:30
...
如果用过node的话,会发现它的环境配置管理在docker容器集群中使用起来比较方便。
以koa为例,在config下定义好custom-environment-variables.json相关环境变量,比如:
{
"mysql_host": "MYSQL_HOST",
"mysql_user": "MYSQL_USER",
"mysql_password": "MYSQL_PASSWORD",
"mysql_db": "MYSQL_DB",
"redis": "REDIS"
}
之后在k8s中配置好对应的环境变量,node就会读取配置的环境变量来运行了,如图:
个人比较喜欢这种方式,相比于我们在框架中定义多种环境配置文件而言,此方式更简洁优雅。
既然node都能做到,PHP也肯定可以的啦。
$_ENV配置
要实现这个效果,简单的方法就是使用$_ENV
来读取环境变量。
PHP目前主流的运行方式有两种:swoole和php-fpm。 对于swoole而言,大部分的swoole框架是支持读取$_ENV
的,
直接按框架方法读取即可,无需额外修改。这里介绍下php-fpm模式下的$_ENV
配置。
1.修改php.ini配置
在php.ini的配置文件中找到variables_order
这行配置,将GPCS
改为EGPCS
2.修改php-fpm配置
在php-fpm的找到clear_env
配置,将yes
改为no
,如果没有,则在[www]
配置域下增加这行配置clear_env = no
框架配置
以laravel的数据库配置为例,将database.conf中对应的配置改为如下:
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => $_ENV['DB_HOST']?$_ENV['DB_HOST']:env('DB_HOST', '127.0.0.1'),
'port' => $_ENV['DB_PORT']?$_ENV['DB_PORT']:env('DB_PORT', '3306'),
'database' => $_ENV['DB_DATABASE']?$_ENV['DB_DATABASE']:env('DB_DATABASE', 'forge'),
'username' => $_ENV['DB_USERNAME']?$_ENV['DB_USERNAME']:env('DB_USERNAME', 'forge'),
'password' => $_ENV['DB_PASSWORD']?$_ENV['DB_PASSWORD']:env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
]
也就是将配置读取的顺序改为:先读取系统环境变量的配置,如果没有则读框架env的配置。
k8s集群配置
在k8s集群对应的应用中添加对应的环境变量,即可实现这个效果了。
上一篇: 数据库中表的基本操作【面试常考点】
下一篇: 解析(读取)JSON串(文件)