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',

总结

记住:

  1. PHP默认UTC时区,差8小时
  2. 改php.ini里的 date.timezone = Asia/Shanghai
  3. 改完重启php-fpm
  4. 或者代码里 date_default_timezone_set('Asia/Shanghai')
  5. CLI和FPM可能用不同的php.ini

最常用:

date_default_timezone_set('Asia/Shanghai');
echo date('Y-m-d H:i:s');

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-9 07:28 

PHP上传文件大小限制,修改php.ini

前言

上传个大点的文件,提示"文件过大"或者直接报错?那是PHP上传限制太小了。本文讲怎么改php.ini调大上传限制。

一、默认限制多大

PHP默认上传限制一般是:

  • upload_max_filesize = 2M
  • post_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里有没有。

九、快速排查

上传报错

  1. 先看PHP的upload_max_filesize够不够
  2. 再看post_max_size够不够
  3. 再看Nginx的client_max_body_size够不够
  4. 再看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;

总结

记住:

  1. 改三个参数:upload_max_filesize、post_max_size、memory_limit
  2. post_max_size >= upload_max_filesize
  3. Nginx也要改client_max_body_size
  4. 改完重启php-fpm和reload nginx
  5. 大文件要加大超时时间

最常用:

upload_max_filesize = 100M
post_max_size = 100M
memory_limit = 128M

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 08:35 

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删掉,或者改回生产配置。

总结

记住:

  1. display_errors = On 显示错误
  2. error_reporting = E_ALL 显示所有错误
  3. 改完重启php-fpm
  4. 生产环境关掉display_errors,开log_errors
  5. 代码里可以用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 协助处理


emer 发布于  2026-10-8 08:34 
'); })();