Symfony中getenv与环境变量转义问题及Redis密码配置异常咨询
解决Symfony环境变量中Redis密码的问题
嗨,这个坑我之前刚踩过!根据你描述的情况——环境变量能查到但应用跑不起来,直接写配置就正常,禁用密码也没问题——大概率是你的Redis密码里包含了特殊字符(比如$、&、!、空格、#这类),这些字符在shell或者Symfony解析环境变量的时候被自动处理了,导致实际传递给Redis客户端的密码和你设置的不一样。
下面给你几个具体的解决办法:
给环境变量值加引号包裹
如果是在.env文件里定义变量,直接用单引号把密码包起来,这样Symfony会原样读取整个密码,不会解析里面的特殊字符:REDIS_PASSWORD='MySuperPass!@#$%^&*'如果是在shell里直接设置环境变量,同样要用单引号(双引号里的
$还是会被shell解析成变量):export REDIS_PASSWORD='MySuperPass!@#$%^&*'使用Symfony的
raw环境变量处理器
如果你不想修改环境变量的定义方式,可以在config.yml里调用环境变量时,指定raw类型,强制Symfony读取原始值:redis: dsn: 'redis://:%env(raw:REDIS_PASSWORD)%@redis-host:6379'或者用Symfony 4+的env函数写法:
redis: password: '%env(raw:REDIS_PASSWORD)%'检查并转义特殊字符(不推荐)
如果你坚持不用引号或者raw处理器,也可以手动转义特殊字符,比如shell里的$要写成\$,!要写成\!,但这种方式容易出错,尤其是密码里特殊字符多的时候,不如前两种方法可靠。
简单来说,就是环境变量里的特殊字符会被默认的解析逻辑修改,导致Redis收到的密码不对,只要让Symfony或者shell原样读取你的密码就能解决问题啦。
内容的提问来源于stack exchange,提问作者i.am.michiel
相关产品推荐
相关产品推荐

