PHP调用高德地图API需通过HTTP请求(curl推荐),key必须作为URL参数,返回JSON须校验status==="1"及info字段,注意限流规则与错误重试逻辑。

PHP 无法直接“读写高德云数据”——高德没有叫“高德云”的开放数据库或云存储服务;你实际要对接的是高德地图 API(如地理编码、路径规划、POI 搜索等),所有数据交互都走 HTTP 请求,不是本地文件读写或数据库连接。
高德 API 请求必须用 file_get_contents 或 curl 发起 GET/POST
高德所有接口(例如 https://restapi.amap.com/v3/geocode/geo)只接受标准 HTTP 请求,返回 JSON。PHP 没有内置“高德 SDK”,得自己拼 URL、传 key、处理响应。
- 用
file_get_contents最快上手,但不支持 POST 或自定义 header,且需确保allow_url_fopen=On(很多生产环境禁用) - 用
curl更可靠:可设超时、重试、SSL 验证,也兼容allow_url_fopen=Off - 别硬编码
key,应从配置文件或环境变量读取,避免泄露 - 高德要求
key必须是 URL 参数(?key=xxx),不能放 header
示例(地理编码):
$url = 'https://restapi.amap.com/v3/geocode/geo?key=YOUR_KEY&address=北京市朝阳区建国路87号';
$json = file_get_contents($url);
$data = json_decode($json, true);
if (isset($data['status']) && $data['status'] == '1') {
echo $data['geocodes'][0]['location']; // 输出经纬度字符串,如 "116.455219,39.925147"
}
返回的 JSON 数据结构不稳定,必须检查 status 和 count 字段
高德 API 不像 RESTful 设计那么规范:成功时 status 是字符串 "1",失败是 "0";有些接口(如 POI 搜索)还带 count 表示结果数,但 count 为 "0" 不一定代表错误,可能是真没搜到。
立即学习“PHP免费学习笔记(深入)”;
- 永远先判断
isset($data['status']) && $data['status'] === '1',不能只用!empty($data) - 注意
info字段:值为"OK"表示请求通,但业务可能失败(比如 key 过期时status仍是"0",info是"INVALID_USER_KEY") - POI 接口返回的
pois是数组,但空结果时是空数组[],不是null,直接foreach安全,但取[0]前必须!empty()
批量调用必须加延时,否则触发限流返回 "INSUFFICIENT_PRIVILEGE"
免费版 key 默认 1000 次/天、100 次/分钟、1 次/秒;超过会返回 status=0 + info="INSUFFICIENT_PRIVILEGE"(不是配额用完,而是频率超限)。
- 单次请求后加
usleep(100000)(100ms)能稳住节奏,比sleep(1)精确且不阻塞整个脚本 - 不要用
for循环密集请求,改用队列或分批 +sleep控制 - 高德不提供批量接口(如“一次查 10 个地址”),每个请求都是独立 HTTP,没法合并
- 如果要查几百个地址,建议用异步 cURL 多线程(
curl_multi_exec),但要注意并发数别超 5,否则照样被限
真正麻烦的不是怎么发请求,而是错误分类和重试逻辑——status=0 可能是网络超时、key 错误、IP 被封、参数缺失、甚至高德服务临时不可用,每种情况该不该重试、重试几次、间隔多久,得按 info 字段区分处理。这点文档里几乎不提,只能靠日志反复抓真实响应来补全判断分支。



















