PHP 8.5.7 中 fileinfo 扩展默认不启用,必须显式在对应版本 php.ini 中添加 extension=fileinfo 并重启服务;否则 finfo_open() 报错或 Laravel/WordPress 文件上传失败。

PHP 8.5.7 中 fileinfo 扩展默认不启用,即使已随源码编译进 PHP,也必须显式加载。调用 finfo_open() 报错 “Call to undefined function” 或 Laravel/WordPress 上传失败(如 UPLOAD_ERR_CANT_WRITE、Unable to guess the mime type),大概率就是这个原因。
确认当前 PHP 版本和 php.ini 路径
phpEnv、宝塔、Homebrew 或手动编译环境都可能共存多个 PHP 版本,务必操作对应版本的配置:
- 终端执行
php -v查看 CLI 当前版本(如 8.5.7) - 执行
php --ini,重点看 Loaded Configuration File 行,记下完整路径(例如D:\phpEnv\php\php-8.5.7\php.ini或/opt/homebrew/etc/php/8.5/php.ini) - Web 环境是否一致?新建
info.php放入网站根目录:<?php phpinfo(); ?>,浏览器访问后搜索 “Loaded Configuration File”,确保与 CLI 路径一致;若不同,需修改 Web 对应的 php.ini
启用 fileinfo 扩展(Windows / phpEnv 常见场景)
phpEnv Windows 预编译包通常已内置 php_fileinfo.dll,只需激活:
- 用记事本或 VS Code 打开上一步确认的
php.ini - 搜索
;extension=fileinfo(注意分号),改为extension=fileinfo(PHP 8.0+ 不需要写.dll) - 检查
extension_dir设置是否正确,例如:extension_dir = "D:\phpEnv\php\php-8.5.7\ext"
并确认该目录下存在php_fileinfo.dll - 保存文件
启用 fileinfo 扩展(Linux/macOS / 宝塔或 Homebrew 场景)
多数现代发行版或包管理器已预编译含 fileinfo 的 PHP,无需源码编译:
立即学习“PHP免费学习笔记(深入)”;
-
宝塔面板:进入【软件商店】→ 找到 PHP 8.5.7 → 【设置】→ 【安装扩展】→ 点击
fileinfo右侧【安装】→ 【重载配置】 -
Ubuntu/Debian:运行
sudo apt install php8.5-fileinfo(注意版本号匹配) -
macOS + Homebrew:通常已内置,只需编辑
php.ini,取消;extension=fileinfo注释即可 - 若
fileinfo.so已存在但未启用(路径如/usr/lib/php/20230831/fileinfo.so),可直接在php.ini中添加:extension=fileinfo.so
验证是否真正生效
改完配置、重启服务后,必须双端验证(CLI + Web):
- 命令行执行:
php -m | grep fileinfo,有输出即 CLI 生效 - 创建
test.php:<?php<br>var_dump(extension_loaded('fileinfo'));<br>var_dump(function_exists('finfo_open'));<br>?>
通过浏览器访问,两个结果都应为bool(true) - 关键测试:执行
php -r "var_dump(finfo_open(FILEINFO_MIME_TYPE) !== false);",输出bool(true)才算完整可用 - 重启服务不可省略:phpEnv 用
phpenv restart;宝塔点【重载配置】;Nginx+PHP-FPM 执行sudo systemctl restart php8.5-fpm nginx;Apache 用sudo apachectl restart



















