Laravel 5.8 php-fpm无法读取系统级APP_TIMEZONE环境变量问题求助
问题核心原因
php-fpm 默认启用安全隔离机制,不会继承系统级环境变量,只有 PHP CLI 模式(Tinker、命令行脚本均属于该模式)会默认读取系统环境变量,这是你 Tinker 正常但 Web 访问(走FPM进程)无法读取APP_TIMEZONE的根本原因。
修复方案
你可以任选以下一种方案实现需求:
- 方案1:修改php-fpm pool配置(推荐,安全度最高)
- 找到php-fpm的pool配置文件,默认路径为
/etc/php/[你的PHP版本号]/fpm/pool.d/www.conf - 在配置文件末尾添加一行规则,显式允许传递
APP_TIMEZONE环境变量:
env[APP_TIMEZONE] = $APP_TIMEZONE- 重启php-fpm服务生效:
systemctl restart php[你的PHP版本号]-fpm,例如PHP8.2版本对应命令为systemctl restart php8.2-fpm
- 找到php-fpm的pool配置文件,默认路径为
- 方案2:在Web服务配置中传递参数
如果使用Nginx作为Web服务,可直接在站点的server配置块的fastcgi参数段添加如下规则:
保存后重启Nginx生效:fastcgi_param APP_TIMEZONE "Asia/Shanghai";systemctl restart nginx - 方案3:关闭php-fpm环境清理(不推荐,安全度低)
若需要批量传递多个系统环境变量,可修改上述www.conf文件中的clear_env参数,将默认值On改为Off,重启php-fpm后即可让FPM继承所有系统环境变量。
验证&收尾操作
修改完成后执行Laravel配置清理命令php artisan config:clear,生产环境可执行php artisan config:cache重新生成配置缓存。你可以临时添加如下测试路由验证配置是否生效:
Route::get('/test-timezone', function () { return [ '系统读取的APP_TIMEZONE' => env('APP_TIMEZONE'), 'Laravel配置时区' => config('app.timezone'), '当前时间' => now() ]; });
测试完成后及时删除该测试路由,避免泄露服务器配置信息。
内容的提问来源于stack exchange,提问作者adaba
相关产品推荐
相关产品推荐

