php 8.3 在 windows 下 php.ini 不生效的根本原因是 cli 与 web 模式加载不同配置文件,且 extension_dir 必须用绝对路径;需通过 php --ini 和 phpinfo() 分别确认实际加载路径,并确保使用 php.ini-development 重命名后修改。

PHP 8.3 在 Windows 下找不到或不读 php.ini,根本不是文件丢了,而是它压根没加载你改的那个文件。
php --ini 和 phpinfo() 显示的路径不一致
这是最常被忽略的第一步陷阱。CLI(命令行)和 Web(Apache/Nginx/IIS)使用完全独立的 php.ini 加载逻辑:
- 运行
php --ini看到的是 CLI 模式下实际加载的配置路径,Loaded Configuration File行才是真实生效的文件 - 新建一个
info.php,内容为<?php phpinfo(); ?>,用浏览器访问后,在页面里搜索Loaded Configuration File—— 这个路径才是 Web 模式真正读的 - 两者几乎总是不同:CLI 可能读
C:\php\php.ini,而 Apache 可能强制指定PHPIniDir "C:/xampp/php",或 Nginx + php-fpm 从php-fpm.conf里读php_admin_value[php_ini]
extension_dir 是相对路径,Web 启动时就失效
PHP 8.3 ZIP 包默认的 php.ini-development 里写的是 extension_dir = "ext",这是相对路径。CLI 在 C:\php 目录下执行时能碰巧找到 ext 子目录;但 Web 服务器启动时工作目录不确定(比如 Apache 可能在 C:\Apache24\bin),就会导致所有扩展静默失败:
- 现象:
php -m能看到mysqli,但phpinfo()里没有,mysqli_connect()报错 - 解决:必须改为绝对路径,例如
extension_dir = "C:/php/ext"(正斜杠更安全,避免反斜杠转义问题) - 验证:改完后重启 Web 服务(不是刷新网页),再看
phpinfo()的extension_dir值是否已更新
你改的 php.ini 根本没被加载(Loaded Configuration File 显示 (none))
如果 php --ini 或 phpinfo() 中 Loaded Configuration File 显示 (none),说明 PHP 完全没读任何 php.ini,全部用内置默认值:
- 常见原因:只复制了
php.ini-development,但没重命名为php.ini(PHP 不认带后缀的模板名) - 路径错误:把
php.ini放在了C:\php\conf\这类子目录,而 PHP 默认只在Configuration File (php.ini) Path所示目录下查找 - 权限问题:文件属性设为“只读”,或 NTFS 权限禁止 IIS_IUSRS / Apache 用户读取
- 注意:Windows 下不存在“系统级”统一 php.ini,别指望复制一份就全局生效
php.ini-production 被误用,扩展全被注释
新手容易直接双击打开 php.ini-production 修改,却不知道这个模板的设计目标是生产环境最小化:
- 它默认禁用所有扩展:
;extension=mysqli这类行前面带分号,且display_errors = Off、error_reporting = 0 - 结果:你明明取消了
extension=zip前的分号,但因为用的是production模板,其他几十行扩展仍被注释,phpinfo()自然不显示 - 正确做法:只用
php.ini-development作为起点,复制并重命名为php.ini,再逐行启用需要的扩展 - 顺手检查:确认里面没有已废弃指令,如
track_errors = On(PHP 8.3 直接报致命错误)
真正关键的不是“有没有 php.ini”,而是“PHP 进程启动时到底打开了哪一个”。每次修改前,先跑一次 php --ini 或 phpinfo() 锁定目标路径——否则所有编辑都是在给空气调参。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











