在多线程Web服务器上使用线程安全版本的PHP而不是多进程Web服务器时会出现此问题.您可以在此处阅读有关Github问题的更多问题,Github问题以及此处的PHP错误报告.还有一些链接,但它们只是从我发布的那几个链接分支出来的.
基本要点是,使用多线程Web服务器,您只需一个处理多个线程的进程.但是,putenv()
/ getenv()
methods不是线程安全的,并且在进程级别更改环境变量,因此该进程下的所有线程都会受到影响.
所以,你最终得到这样的东西:(如本期所述):
Request 1: {starts --- loads env --- work --- finishes} Request 2: {starts ----- loads env --- work --- finishes}
因此,请求1进入,加载环境,并开始工作.当请求1正在工作时,请求2进入并在另一个线程上启动.在请求2读取环境变量之前,请求1完成并且PHP清除所有设置的变量putenv()
.现在,请求2尝试读取环境,但得到null
因为变量在请求1完成时被清除.
可以通过两种方式缓解此问题:
不要.env
在生产中使用文件.直接设置环境变量,并禁用phpdotenv.包本身也提出了这一点:
phpdotenv适用于开发环境,通常不应用于生产环境.在生产中,应该设置实际的环境变量,以便在每个请求上加载.env文件没有开销.
切勿在env()
配置文件之外使用该方法,并确保缓存配置文件.通过使用此方法,环境将被读取一次:创建配置文件缓存时.每个实际的Web请求都将从缓存中读取数据,并且永远不会再次触摸环境变量.