必须用phpinfo()查web环境实际加载的php.ini路径,cli则用php --ini;改完需重启对应服务(如php8.2-fpm),且upload_max_filesize等php_ini_system项无法用ini_set()动态修改。

改 php.ini 不生效?八成是没找对文件,或改完没重启服务。
怎么确认当前 PHP 实际加载的是哪个 php.ini
别猜路径,用实际运行环境查:
- Web 环境:新建
info.php,内容为<?php phpinfo(); ?>,浏览器访问后搜索Loaded Configuration File—— 这个路径才是你该改的文件 - CLI 环境:终端执行
php --ini,看Loaded Configuration File行输出 - 常见误区:Linux 下
/etc/php/8.2/cli/php.ini是 CLI 用的,Web 用的可能是/etc/php/8.2/apache2/php.ini或/etc/php/8.2/fpm/php.ini,版本号要按你实际安装的替换
改完 php.ini 为什么还是不生效
改了 ≠ 生效。必须满足两个硬条件:
- 修改后保存文件,且 PHP 进程有读权限(
ls -l看属主和权限) - 必须重启对应的服务:
– Apache:运行sudo systemctl restart apache2
– PHP-FPM:运行sudo systemctl restart php8.2-fpm(把8.2换成你实际版本)
– Nginx + PHP-FPM 组合:只重启php*-fpm即可,Nginx 不用动 - 验证是否生效:在 Web 页面里调用
ini_get('upload_max_filesize'),或 CLI 下执行php -r "echo ini_get('memory_limit');"
哪些配置项能用 ini_set() 动态改,哪些不能
ini_set() 不是万能的,它只对 PHP_INI_USER 和 PHP_INI_ALL 级别的指令有效:
- 能改的:例如
display_errors、error_reporting、date.timezone(但注意:它不改变error_log路径) - 不能改的:例如
memory_limit、upload_max_filesize、post_max_size、max_execution_time—— 这些是PHP_INI_SYSTEM级,ini_set()调用会静默返回false,不报错也不生效 - 验证方式:
var_dump(ini_get_all()['upload_max_filesize']['access']),返回4表示PHP_INI_SYSTEM,不可运行时修改
upload_max_filesize 改大了,上传还是失败?检查这三个联动项
单改 upload_max_filesize 很可能白忙,PHP 对上传限制是链式校验:
-
post_max_size必须 ≥upload_max_filesize(建议多留 8M,比如后者设100M,前者设108M) -
memory_limit必须 >post_max_size(尤其处理大 POST 数据时,否则解析阶段就 OOM) - 还要确认
file_uploads = On,且upload_tmp_dir目录存在、可写(ls -ld /tmp或你自定义的路径) - 测试命令:
php -r "echo ini_get('upload_max_filesize'), ' ', ini_get('post_max_size'), ' ', ini_get('memory_limit');"
真正容易被忽略的点:同一个服务器上多个 PHP 版本共存时,php --ini 和 phpinfo() 查出的路径可能完全不同;改完任意一个,都得确认对应服务是否已重启——漏掉任何一个环节,配置就永远“看起来改了,实际没用”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











