处理php出现default timezone抖动的问题

懒癌发作1年多,再次回来写随笔。(上次是16年,再上次是13年,好像懒的没救了)

这回遇到一个系统前端展现的时间在无规律抖动的问题;

前端php环境是5.3,运行于apache上,php.ini中已经设置了date.timezone="Asia/Shanghai",php中不显示设定任何的date_default_timezone_set();

使用phpinfo查看,date.timezone确实是上海,但Default timezone就时不时飘到了太平洋去;

同事帮我分析了一下,并给了官方文档说明default timezone的选定顺序,http://php.net/manual/zh/function.date-default-timezone-get.php

date_default_timezone_set() > 环境变量TZ > date.timezone > 查询操作系统;(php version < 5.4)

or

date_default_timezone_set() > date.timezone;(php version >= 5.4)

同事怀疑我有定时程序在不断修改环境变量TZ,但是apache是通过发行版的源安装的,apache用户更是nologin,没有机会启动定时程序进行环境变量修改;一时无果;

后来又仔细分析了phpinfo的区别,发现当时区飘到太平洋的时侯,php的Environment里面确实会出现一条TZ变量,正常时没有;

同时一起出现的新增环境变量还有一个django.setting,我才突然想起来,这个apache服务器后面还跑着一个python(django)项目,然后到那个django项目中一查,确实设定了一个错误的时区;

把django.setting中的错误时间给改过来后,过一点时间后(可能是在等缓存过期),时区抖的问题就消失了;

于是从头疏理一遍问题发生的过程:

  • apache后面跑了两个项目:一个php项目,一个python项目;
  • python项目的wsgi模式设置的为WSGIScriptAlias;
  • php版本为5.3;
  • python项目会在运行中修改环境变量TZ(受django设定),如果一个apache子进程运行了这个python项目,这个子进程就会增加一个TZ环境变量;
  • php项目不显式设定date_default_timezone_set,当它运行于一个全新的apache子进程中时,会使用date.timezone,而当它运行于一个已经运行过python项目的apache子进程中时,会看到TZ环境变量,从而拿到错误的timezone;

于是,我也就明白了为啥从php 5.4开始抛弃TZ了;

原文地址:https://www.cnblogs.com/ZisZ/p/8316552.html