phpenv中需手动启用exif扩展:先在对应php版本的php.ini中按序开启php_mbstring.dll和php_exif.dll,确保依赖正确;再用exif_read_data($file, 'gps')读取gps数据并转换为十进制坐标。

phpEnv里exif扩展默认是关闭的
phpEnv安装包自带exif扩展(php_exif.dll),但不会自动启用。不手动开启,调用exif_read_data()会直接报错Call to undefined function exif_read_data(),不是缺模块,是没加载。
- 确认PHP版本:phpEnv支持多个PHP版本共存,必须进对应版本的
php.ini修改,比如php-7.4.33\php.ini,别改错目录 - 扩展依赖
mbstring:exif必须和mbstring一起启用,否则即使加了extension=php_exif.dll也启动失败,错误日志里会出现Unable to load dynamic library 'php_exif.dll' - Windows下DLL路径不用写全:phpEnv已配置好
extension_dir,直接写extension=php_exif.dll即可,加绝对路径反而可能出错
启用exif的三步操作顺序不能乱
顺序错了会导致Apache/Nginx重启失败或扩展不生效。phpEnv的php.ini里要按如下顺序放开(取消分号注释):
- 先放开
extension=php_mbstring.dll(必须在exif之前) - 再放开
extension=php_exif.dll - 确保
exif.encode_unicode = ISO-8859-15(或留默认)——这个影响中文标签读取,但不影响GPS字段
改完保存,用phpEnv面板「重启PHP服务」或直接重启Apache/Nginx。验证是否成功:php -m | findstr exif(Windows命令行),或新建phpinfo.php访问看EXIF模块是否列出。
读取照片GPS信息的关键点
exif_read_data()能读GPS,但默认只返回基础EXIF,GPS坐标藏在GPS子数组里,且原始值是度分秒格式(rational数),不是十进制经纬度。
- 必须传
sections参数:exif_read_data($file, 'GPS'),不指定就拿不到GPS键 - GPS数据结构是嵌套数组:
$exif['GPS']['GPSLatitude']是三个num/den组成的数组,需用exif_process_gps()这类辅助函数转成小数 - 部分手机(尤其iOS)默认关闭照片定位写入,即使有GPS模块,拍出来的图也可能根本没有
GPSLatitude字段 - 注意文件权限:phpEnv运行在Windows服务模式下,如果照片在OneDrive、加密目录或用户文档深层路径,PHP可能因权限读不到文件,建议先复制到
D:\phpEnv\www\test.jpg测试
一个最小可运行的GPS读取示例
把下面代码存为gps.php,放在phpEnv的web根目录下运行(别用CLI):
<?php $file = 'test.jpg';
if (!file_exists($file)) {
die('文件不存在');
}
$exif = exif_read_data($file, 'GPS', true);
if (empty($exif['GPS'])) {
die('无GPS信息');
}
// 简单转经纬度(仅示意,实际需处理北纬/南纬、东经/西经符号)
function gps2float($arr) {
if (!is_array($arr) || count($arr) !== 3) return 0;
$deg = $arr[0]['num'] / $arr[0]['den'];
$min = $arr[1]['num'] / $arr[1]['den'];
$sec = $arr[2]['num'] / $arr[2]['den'];
return $deg + $min / 60 + $sec / 3600;
}
$lat = gps2float($exif['GPS']['GPSLatitude']);
$lng = gps2float($exif['GPS']['GPSLongitude']);
echo "纬度: $lat, 经度: $lng";
?>
真正麻烦的不是开启扩展,而是GPS数据本身不规范:不同厂商对GPSAltitudeRef、GPSMapDatum的写法五花八门,连GPSLatitudeRef(N/S)都可能缺失。别指望一次解析覆盖所有手机型号。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











