XAMPP Windows版默认已编译exif扩展但需手动启用:取消php.ini中extension=exif的注释,确认extension_dir路径正确,重启Apache,并建议同时启用mbstring扩展以支持编码处理。

确认exif扩展是否已启用
XAMPP 默认 Windows 版本通常已编译 exif 扩展,但 php.ini 中默认是注释掉的。直接运行 phpinfo() 页面,搜索 “exif” —— 如果没看到任何 exif 相关模块信息,说明它当前未激活。
打开 XAMPP 控制面板 → 点击 “Config” → 选择 “PHP (php.ini)” → 在打开的文件中搜索:;extension=exif。去掉前面的分号,改为:extension=exif。保存后重启 Apache。
- Linux/macOS 下 XAMPP 的
php.ini路径通常是/opt/lampp/etc/php.ini或/Applications/XAMPP/xamppfiles/etc/php.ini - 改完务必重启 Apache,否则修改不生效
- 某些旧版 XAMPP(如 7.4 以前)可能需同时启用
extension=mbstring,因为exif_read_data()内部依赖 mbstring 处理字符串编码
exif_read_data() 读取失败的常见原因
exif_read_data() 返回 false 不一定代表扩展没开,更可能是输入条件不满足。最常踩的坑是:
- 传入的文件不是 JPEG 或 TIFF:用
exif_imagetype($filename)先判断,只对IMAGETYPE_JPEG或IMAGETYPE_TIFF_II/IMAGETYPE_TIFF_MM有效;PNG、WebP、GIF 一律返回false - 文件路径错误或权限不足:确保 PHP 进程有读取该文件的权限(尤其在 Windows 上注意反斜杠转义或使用正斜杠)
- 图片本身被剥离过 EXIF:手机上传前压缩、微信/QQ 发送、图床自动处理等都会清空 EXIF,此时函数虽不报错但返回空数组
- 中文字段乱码:部分相机写入的
Make或Model是 Shift-JIS 或 GBK 编码,exif_read_data()默认按 ISO-8859-1 解析,可用mb_convert_encoding($str, 'UTF-8', 'auto')尝试转换
安全读取 EXIF 的最小可靠代码片段
不要直接 print_r 整个数组,先做基础校验再取关键字段。下面这段能避开多数空值和类型错误:
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
<?php
$filename = 'photo.jpg';
if (!file_exists($filename) || exif_imagetype($filename) !== IMAGETYPE_JPEG) {
die('文件不存在或非 JPEG 格式');
}
<p>$exif = exif_read_data($filename, 'EXIF', true);
if ($exif === false) {
die('EXIF 数据不可读(可能被清除或损坏)');
}</p><p>// 安全提取常用字段
$datetime = $exif['EXIF']['DateTimeOriginal'] ?? null;
$make = $exif['IFD0']['Make'] ?? null;
$model = $exif['IFD0']['Model'] ?? null;
$orient = $exif['IFD0']['Orientation'] ?? 1;</p><p>echo "拍摄时间: " . ($datetime ?: '未记录') . "\n";
echo "厂商: " . ($make ?: '未知') . "\n";
echo "型号: " . ($model ?: '未知') . "\n";
echo "方向: " . $orient . "\n";
?>注意这里用了 'EXIF' 和 'IFD0' 两个可选参数:前者聚焦曝光/快门类信息,后者包含基础元数据(Make/Model/Orientation),比不传参更稳定;true 表示按层级分组,避免字段名冲突。
Orientation 值的实际含义与旋转逻辑
EXIF 中的 Orientation 不是角度值,而是 JPEG 规范定义的 8 种翻转/旋转组合。常见值只有 4 个有意义:
-
1:正常(无需处理) -
3:180° 旋转(上下左右全反) -
6:顺时针 90°(需旋转后宽高互换) -
8:逆时针 90°(同上,但方向相反)
别直接用 $exif['Orientation'] * 90 计算角度 —— 值为 2、4、5、7 时对应镜像翻转,PHP GD 或 Imagick 处理时需额外调用 imageflip() 或设置 flip flag,不能只靠 rotate。
真正容易被忽略的是:浏览器原生显示 JPEG 时会自动应用 Orientation,但 PHP 的 imagecreatefromjpeg() 不会。所以如果你后续要做缩略图或水印,必须手动按 Orientation 值旋转/翻转画布,否则最终图像朝向错误。

















