exif扩展需编译时启用--enable-exif,非php.ini可开启;验证用php -r "var_dump(extension_loaded('exif'));"返回true即就绪,否则需重编译或换PHP版本。

确认 PHP 是否已编译支持 exif
Exif 扩展不是「开关式」启用的插件,它依赖 PHP 编译时带 --enable-exif 选项。XAMPP 官方 Windows 版本默认已启用该扩展,但 Linux/macOS 下自行编译的 XAMPP 可能未开启。运行 php -m | grep exif,若无输出,说明未启用或未编译进 PHP。
常见误区是以为只要在 php.ini 里取消注释 extension=exif 就行——这仅对「动态加载扩展」有效;而 exif 是 PHP 内置模块(built-in),不走 extension= 加载路径,所以改 php.ini 没用。
- Windows XAMPP:基本不用手动操作,直接跳到下一步验证
- Linux/macOS XAMPP:需重编译 PHP 或换用系统包管理器安装的 PHP(如
apt install php-exif) - 若用 Docker 或自建环境,检查
phpinfo()中「Configure Command」是否含--enable-exif
Windows XAMPP 下验证 exif 是否可用
打开命令行,执行以下命令快速验证:
php -r "var_dump(extension_loaded('exif'));"
返回 bool(true) 即表示已就绪。若为 false,检查是否误用了非 XAMPP 自带的 PHP(比如 PATH 里混进了其他版本)。
接着测试读取一张 JPEG 文件:
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 -r "$exif = exif_read_data('C:/test.jpg'); var_dump(isset(\$exif['EXIF']['DateTime']));"
- 确保路径是绝对路径,且文件存在、可读
- 若报错
exif_read_data(): File not found,不是扩展问题,而是路径或权限错误 - 若报错
Call to undefined function exif_read_data(),说明扩展确实未启用,需排查 PHP 版本来源
exif_read_data() 的参数陷阱与兼容性注意
exif_read_data() 行为受参数影响极大,尤其在处理含 GPS 或多字节注释的图片时容易静默失败或返回空数组。
- 第二个参数(
$sections)建议显式传'IFD0,EXIF,GPS,THUMBNAIL',避免遗漏关键段 - 第三个参数(
$arrays)设为true才能按层级结构返回数据,否则所有字段扁平化,GPSLatitude这类字段会丢失上下文 - 若图片含中文注释(如 IPTC UserComment),必须同时启用
mbstring扩展,否则可能乱码或解析中断 - JPEG 文件若被某些编辑器「保存为 Web 格式」或压缩过,EXIF 头常被清除——这不是代码问题,是源文件本身无数据
读取 GPS 坐标时的实际处理逻辑
EXIF 中的 GPS 数据是分字段存储的有理数(如 GPSLatitude => [22, 34567, 1000] 表示 22°34.567′),不能直接当字符串用。
简单转换示例(只处理北纬东经):
$lat = $exif['GPS']['GPSLatitude']; $lat_deg = $lat[0]['numerator'] / $lat[0]['denominator']; $lat_min = $lat[1]['numerator'] / $lat[1]['denominator']; $lat_sec = $lat[2]['numerator'] / $lat[2]['denominator']; $latitude = $lat_deg + $lat_min / 60 + $lat_sec / 3600;
真正麻烦的是方向判断(GPSLatitudeRef 是 'N' 还是 'S')、单位一致性、以及部分相机写入的 GPS 数据格式不规范(比如把度分秒全塞进一个字段)。生产环境建议用 symfony/exif 或 spatie/exif 这类封装库,而非手撕解析逻辑。
最易被忽略的一点:手机微信「原图发送」后,iOS 系统会自动剥离 GPS 信息(出于隐私),而 Android 行为不一——别拿微信传过来的图直接测 GPS 解析,先用系统相册导出原图验证。

















