phpMyAdmin无法单独为不同MySQL服务器配置PHP时区(全局统一),需通过php.ini或date_default_timezone_set()设置。MySQL时区则通过SETtime_zone或my.cnf单独配置,两者独立,不可混淆。
许多朋友在使用phpMyAdmin管理多个MySQL实例时,常常遇到一个棘手的问题:试图为每个服务器单独配置PHP时区,却总是无法实现。这个问题的根源其实很简单——phpMyAdmin本身,或者更准确地说,PHP的运行机制决定了它无法为每个MySQL服务器单独设置一个PHP时区。
时区在PHP中是全局的,跟随整个SAPI环境。它不像host、port那样可以按连接参数来配置。所谓“为某台服务器设时区”,实际影响的是整个phpMyAdmin页面中所有与日期相关的函数,比如date()、strtotime()这些。而这个设置,跟MySQL实例本身的时间行为,完全是两码事。
长期稳定更新的攒劲资源: >>>点此立即查看<<<

phpMyAdmin的服务器配置数组$cfg['Servers'],其设计目的只处理数据库连接相关的字段,例如host、port、auth_type、user、password。官方文档中并没有timezone或php_timezone这样的键。如果强行添加$cfg['Servers'][1]['timezone'] = 'Asia/Shanghai',PHP解析时会直接忽略,相当于白写。更糟的是,如果格式不对,整个配置文件可能加载失败,导致phpMyAdmin无法进入。
所有phpMyAdmin请求共享同一个PHP环境,因此时区设置必须在更上层统一处理。具体来说,就两个地方:
date_default_timezone_set('Asia/Shanghai')。这个入口文件通常是index.php或者libraries/common.inc.php。php.ini里设置date.timezone,比如写成date.timezone = Asia/Shanghai。这两种方式效果相近,但优先级有区别:date_default_timezone_set()的优先级高于php.ini。如果代码里显式调用了,它会覆盖配置文件中的值;如果没调用,则按php.ini的设置执行。无论选择哪种,它对所有配置好的MySQL服务器都是一视同仁的,没有例外。
如果真正关心的是“某台MySQL实例内部的时间行为”,比如NOW()函数返回的时间是否正确,那么需要操作的是MySQL本身,而不是phpMyAdmin。关键方法如下:
SET time_zone = '+08:00';,这是会话级别的,只对当前连接有效,断开即失效。/etc/mysql/my.cnf)中设置default-time-zone = '+08:00',这是全局的,需要重启MySQL才能生效。SET time_zone语句。但这既不改PHP的时区,也不会将这个设置持久化到MySQL配置文件中。必须提醒的是,MySQL的time_zone和PHP的date.timezone是两套完全独立的系统。PHP时区影响的是phpMyAdmin界面里显示的时间、导出文件名中的日期等;而MySQL时区影响的是NOW()、CURRENT_TIMESTAMP这些函数的返回值。混为一谈,容易导致问题。
假设管理的两台MySQL实例分别在东京和纽约,处于不同时区。这种情况下,无法依靠phpMyAdmin的配置让它们各自显示本地时间——phpMyAdmin本身不提供这个功能。
行业内的推荐做法是:
date.timezone = UTC。SYSTEM或+00:00来存储时间戳。如果强行把PHP时区设为某台服务器的本地时区,后果很明显:其他服务器的显示时间会全部错乱,而且导出的SQL中如果有INSERT ... VALUES (NOW())这样的语句,插入的时间也会带有错误的时区偏移,将来排查问题时将非常麻烦。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述