PHP获取当前时间不对,时区设置date.timezone
前言
PHP用date()获取当前时间,结果比实际时间差了8个小时?这是最常见的时区问题。PHP默认用UTC时区,北京时间是东八区,所以差了8小时。本文讲怎么改。
一、问题现象
<?php
echo date('Y-m-d H:i:s');
输出:
2026-10-09 00:30:00
但实际北京时间是:
2026-10-09 08:30:00
差了8个小时。
二、原因
PHP默认时区是UTC(世界标准时间),不是北京时间。
北京时间是 UTC+8,所以差了8小时。
三、解决方法
方法1:改php.ini(推荐)
第一步:找到php.ini
php --ini
找到Loaded Configuration File那一行:
Loaded Configuration File: /etc/php.ini
第二步:修改date.timezone
打开php.ini,找到这行:
;date.timezone =
改成:
date.timezone = Asia/Shanghai
第三步:重启php-fpm
systemctl restart php-fpm
方法2:代码里设置(临时)
不想改php.ini,可以在代码里设:
<?php
date_default_timezone_set('Asia/Shanghai');
echo date('Y-m-d H:i:s');
注意: 要在所有日期函数之前设。
方法3:.htaccess里设
Apache的话,可以在.htaccess里设:
php_value date.timezone Asia/Shanghai
四、常用时区对照
| 时区 | 说明 |
|---|---|
| Asia/Shanghai | 北京时间(东八区) |
| Asia/Chongqing | 重庆时间 |
| Asia/Urumqi | 乌鲁木齐时间 |
| Asia/Hong_Kong | 香港时间 |
| Asia/Taipei | 台北时间 |
| Asia/Tokyo | 东京时间(东九区) |
| America/New_York | 纽约时间 |
| Europe/London | 伦敦时间 |
| UTC | 世界标准时间 |
国内用: Asia/Shanghai
五、验证时区
看当前时区
<?php
echo date_default_timezone_get();
// 输出:Asia/Shanghai
看服务器时间
date
看PHP时间
<?php
echo date('Y-m-d H:i:s');
对比一下,应该一样了。
六、常见坑
坑1:CLI和FPM时区不一样
命令行里改了php.ini,但网页上还是不对。
原因: CLI和FPM用不同的php.ini。
解决: 看phpinfo()里的配置路径,改对应的那个。
<?php
phpinfo();
搜"Loaded Configuration File",看用的哪个文件。
坑2:改了没重启
改了php.ini忘了重启php-fpm。
解决:
systemctl restart php-fpm
坑3:代码里又改回去了
某个框架或库里又调了 date_default_timezone_set('UTC')。
解决: 全局搜一下,看哪里改的。
坑4:用了gmdate()
gmdate()总是用UTC时区,不管你设什么。
比如:
echo gmdate('Y-m-d H:i:s');
这个输出的是UTC时间,不是北京时间。
解决: 用date()不要用gmdate(),或者自己加8小时。
坑5:数据库时间不对
PHP时区对了,但MySQL里的时间不对。
原因: MySQL自己也有时区设置。
解决: MySQL连接后设时区:
SET time_zone = '+8:00';
或者改my.cnf:
default-time-zone = '+8:00'
七、常用日期函数
获取当前时间
date_default_timezone_set('Asia/Shanghai');
// 当前日期时间
echo date('Y-m-d H:i:s');
// 今天
echo date('Y-m-d');
// 现在几点
echo date('H:i:s');
// 时间戳
echo time();
时间戳转日期
$time = time();
echo date('Y-m-d H:i:s', $time);
日期转时间戳
$str = '2026-10-09 08:30:00';
echo strtotime($str);
几天以后
// 3天后
echo date('Y-m-d', strtotime('+3 days'));
// 下周
echo date('Y-m-d', strtotime('next week'));
八、框架里的设置
ThinkPHP
在config/app.php里:
'default_timezone' => 'Asia/Shanghai',
Laravel
在config/app.php里:
'timezone' => 'Asia/Shanghai',
总结
记住:
- PHP默认UTC时区,差8小时
- 改php.ini里的
date.timezone = Asia/Shanghai - 改完重启php-fpm
- 或者代码里
date_default_timezone_set('Asia/Shanghai') - CLI和FPM可能用不同的php.ini
最常用:
date_default_timezone_set('Asia/Shanghai');
echo date('Y-m-d H:i:s');
遇到问题加QQ23979811 协助处理
PHP上传文件大小限制,修改php.ini
前言
上传个大点的文件,提示"文件过大"或者直接报错?那是PHP上传限制太小了。本文讲怎么改php.ini调大上传限制。
一、默认限制多大
PHP默认上传限制一般是:
upload_max_filesize= 2Mpost_max_size= 8M
传个10M的文件就不行了。
二、要改哪几个参数
1. upload_max_filesize
单个文件最大大小:
upload_max_filesize = 100M
2. post_max_size
整个POST请求最大大小:
post_max_size = 100M
注意: post_max_size要 >= upload_max_filesize。
3. memory_limit
脚本可用内存:
memory_limit = 128M
要比post_max_size大。
4. max_execution_time
脚本最大执行时间(秒):
max_execution_time = 300
传大文件要久一点,设长点。
5. max_input_time
接收数据最大时间(秒):
max_input_time = 300
三、找php.ini
php --ini
或者写个phpinfo:
<?php
phpinfo();
?>
看Loaded Configuration File。
四、修改php.ini
改成100M上传
upload_max_filesize = 100M
post_max_size = 100M
memory_limit = 128M
max_execution_time = 300
max_input_time = 300
改成50M上传
upload_max_filesize = 50M
post_max_size = 50M
memory_limit = 64M
五、改完重启
PHP-FPM
systemctl restart php-fpm
Apache
systemctl restart httpd
六、验证
写个phpinfo,看这几个参数改了没:
<?php
phpinfo();
?>
搜 upload_max_filesize,看是不是改过来了。
七、Nginx也要改
光改PHP不够,Nginx也有限制。
Nginx配置
client_max_body_size 100M;
改完重载
nginx -t
nginx -s reload
八、常见坑
坑1:改了php.ini不生效
改的不是实际加载的那个。
解决: 用phpinfo看实际加载的是哪个。
坑2:只改了upload_max_filesize
post_max_size没改,还是不行。
注意: 两个都要改,post_max_size >= upload_max_filesize。
坑3:Nginx挡了
PHP改了,Nginx的client_max_body_size没改,还是413错误。
解决: Nginx也改。
坑4:内存不够
Allowed memory size of ... bytes exhausted
解决: 加大memory_limit。
坑5:上传超时
大文件传一半就断了。
解决: 加大max_execution_time和max_input_time。
坑6:.htaccess里覆盖了
有些主机在.htaccess里设了php_value。
检查: 看看.htaccess里有没有。
九、快速排查
上传报错
- 先看PHP的upload_max_filesize够不够
- 再看post_max_size够不够
- 再看Nginx的client_max_body_size够不够
- 再看memory_limit够不够
十、推荐配置
一般网站(20M上传)
upload_max_filesize = 20M
post_max_size = 20M
memory_limit = 64M
文件站(100M上传)
upload_max_filesize = 100M
post_max_size = 100M
memory_limit = 128M
max_execution_time = 300
max_input_time = 300
Nginx对应
client_max_body_size 100M;
总结
记住:
- 改三个参数:upload_max_filesize、post_max_size、memory_limit
- post_max_size >= upload_max_filesize
- Nginx也要改client_max_body_size
- 改完重启php-fpm和reload nginx
- 大文件要加大超时时间
最常用:
upload_max_filesize = 100M
post_max_size = 100M
memory_limit = 128M
遇到问题加QQ23979811 协助处理
PHP开启错误显示,php.ini配置修改
前言
PHP报错了,页面白屏或者500,啥也不显示,不知道哪错了?开了错误显示就能看到具体错误了。本文讲怎么改php.ini开启错误显示。
一、为什么不显示错误
生产环境为了安全,默认不显示错误,防止暴露敏感信息(路径、数据库密码等)。
但开发的时候就不方便了,啥也看不到。
二、找到php.ini
找php.ini位置
php --ini
输出:
Loaded Configuration File: /etc/php.ini
或者:
/etc/php/7.4/cli/php.ini
注意:CLI和FPM的php.ini可能不一样。
看当前加载的是哪个
写个phpinfo:
<?php
phpinfo();
?>
浏览器访问,看Loaded Configuration File。
三、修改php.ini
1. 显示错误
display_errors = On
2. 报错级别
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
或者全开:
error_reporting = E_ALL
3. 错误日志
log_errors = On
error_log = /var/log/php_errors.log
4. 显示启动错误
display_startup_errors = On
四、改完重启
PHP-FPM
systemctl restart php-fpm
或者:
systemctl reload php-fpm
Apache
systemctl restart httpd
五、代码里临时开启
不想改php.ini,在代码开头加:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
或者:
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
六、常见错误类型
E_ALL
所有错误和警告。
E_ERROR
致命运行错误,脚本停止。
E_WARNING
运行时警告,脚本继续。
E_NOTICE
运行时注意,比如未定义变量。
七、常见坑
坑1:改了php.ini不生效
改的不是实际加载的那个php.ini。
解决: 用 php --ini 看实际加载的是哪个。
坑2:FPM和CLI的php.ini不一样
命令行改了,网页上不生效。
原因: CLI和FPM用不同的php.ini。
解决: 改FPM的那个,比如 /etc/php/7.4/fpm/php.ini。
坑3:页面白屏
可能是语法错误,php.ini都没加载起来。
检查: 看PHP错误日志。
坑4:开了错误显示有安全风险
生产环境不能开!
注意: 排查完一定要改回去。
坑5:.htaccess里覆盖了
有些主机在.htaccess里设了php_flag。
检查: 看看.htaccess里有没有。
八、生产环境配置
生产环境不要开display_errors,但要开日志:
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
九、查看错误日志
PHP错误日志
tail -f /var/log/php_errors.log
Nginx错误日志
tail -f /var/log/nginx/error.log
Apache错误日志
tail -f /var/log/httpd/error_log
十、快速排查
第一步:代码里临时开
ini_set('display_errors', 1);
error_reporting(E_ALL);
第二步:看具体报错
刷新页面,看报什么错。
第三步:解决完删掉
改完了把代码里的ini_set删掉,或者改回生产配置。
总结
记住:
display_errors = On显示错误error_reporting = E_ALL显示所有错误- 改完重启php-fpm
- 生产环境关掉display_errors,开log_errors
- 代码里可以用ini_set临时开
开发环境推荐:
display_errors = On
error_reporting = E_ALL
log_errors = On
生产环境推荐:
display_errors = Off
log_errors = On
error_reporting = E_ALL & ~E_NOTICE
遇到问题加QQ23979811 协助处理