使用Ajax/PHP调用Wikidata接口速度慢,该如何优化提速?
Wikidata请求速度优化方案
关于是否需要单独创建PHP文件的说明
不需要为每个请求单独创建PHP文件,仅需编写1个统一的公共PHP中转接口即可:接口接收实体ID参数、请求Wikidata服务、提取你需要的图片名和enwiki链接两个字段后返回给前端。这一操作可将单请求返回数据量从几十KB压缩到不足100B,大幅降低传输耗时,注意给该接口增加缓存逻辑即可。
其他可落地的耗时优化方案
- 优先改用Wikidata官方精简接口:放弃全量EntityData接口,改用Wikidata自带的
wbgetentitiesAPI,通过参数指定仅返回你需要的字段,直接降低Wikidata侧返回数据体积。示例请求参数如下:
该接口返回内容仅包含enwiki链接和P18图片属性,比当前你使用的全量接口返回体积小70%以上,无需额外过滤大量冗余字段。action=wbgetentities&ids=Q42&props=sitelinks|claims&languages=en&sitefilter=enwiki&claimfilter=P18&format=json - 增加多级缓存逻辑:
- 客户端缓存:前端拿到指定QID的查询结果后存入localStorage,同一用户再次访问相同实体时直接读取本地缓存,无需发起网络请求
- 服务端缓存:如果使用PHP中转接口,可将每个QID的查询结果存入Redis或本地文件,缓存时长可设置为24小时以上,Wikidata实体属性更新频率极低,缓存命中率可达95%以上,大部分请求无需实际调用Wikidata服务,耗时可降至100ms以内
- 优化前端逻辑:不要在前端AJAX逻辑中拼接图片地址,可在PHP接口提取到图片名称后直接生成完整的图片访问地址返回,同时可提前判断是否存在P18属性,不存在时直接返回占位图地址,避免前端逻辑报错
- 批量请求合并:如果同一页面需要查询多个Wikidata实体,不要逐个发起请求,可将多个QID用
|分隔后拼接到同一个wbgetentities请求的ids参数中,一次请求获取所有结果,减少TCP握手和请求排队耗时 - 开启传输优化配置:如果使用自建PHP中转接口,给服务器开启Gzip/Brotli压缩,同时启用HTTP/2协议,进一步降低数据传输耗时
内容的提问来源于stack exchange,提问作者BMesc
相关产品推荐
相关产品推荐

