php - 计算最近城市的最有效方法(来自白名单)

标签 php javascript iframe geolocation

我有一个城市白名单。比方说,西雅图、波特兰、塞勒姆。使用 GeoIP,我会检测用户城市。我们称它为 $user_city。基于 $user_city,我想显示距离我的白名单最近的城市(西雅图 || 波特兰 || 塞勒姆)在 140 英里以内的分类列表。如果城市未在 140 英里内列出,我会显示一个下拉列表并要求用户手动选择一个城市。

有几种方法可以做到这一点:

  1. 即时计算(我在其中一个 SO 答案中找到了一个算法)
  2. 在 DB 的帮助下(让我解释一下):

create a table called regions

地区会有

city 1 | city 2 | distance (upto 140 miles)
city 1= cities from whitelist
city 2= any city within 140 miles from city 1

这将创建一个合理大小的表。如果我的白名单有200个城市,每个城市140英里以内有40个城市(或城镇)。这将创建 8000 行。

Now, when a user comes to my site:
1) I check if user is from whitelist city already (city 1 column). If so, display that city
2). If not, check if $user_city is in "city 2" column
 2a) if it is, get whitelist city with lowest distance
 2b) if it is not, display drop-down for manual input

最终约束:无论我们选择哪种方法,它都必须在 iFrame 中运行。我的意思是,我可以在我的 mysite1.com 上创建此页面并将此页面嵌入 someothersite2.com 中的 iframe 中吗?它仍然能够获取 user_city 并找到最近的白名单城市吗?我知道有一些跨域脚本规则,所以我不确定 iFrame 是否能够获取用户 IP 地址,将其传递给 GeoIP,并将其解析为 $user_city

那么,我的问题是:

如何最好地做到这一点?如果很多人将我的页面嵌入到他们的页面中(使用 iframe),那么我的服务器每秒将受到 10000s 次的攻击(一厢情愿,但让我们假设是这种情况)。我不知道数据库是否能够处理如此多的冲击。我不想为更多的数据库服务器或网络服务器付费。我想尽量减少我这边的资源需求。因此,我不介意通过 JavaScript 将一些工作卸载到用户的浏览器。

编辑:

  1. 一些答案​​建议存储经纬度,然后进行数学运算。我建议创建一个“区域”表的原因是这样所有数学都是预先计算的。如果我有一个城市的“白名单”,并且如果我为每个列入白名单的城市预先计算所有可能的附近城市。这样我就不必每次都计算距离(例如使用 Haversine 算法)。

  2. 是否可以通过巧妙地使用 Java Script 将所有这些卸载到用户的浏览器?我不想为了免费服务而让我的服务器重载。它可能会赚钱,但我非常接近破产,我担心我的服务器会在我赚到足够的钱来支付升级费用之前宕机。

所以,这个问题的三个限制是 1) 应该在 iframe 内部工作(我希望这会像病毒一样传播开来,每个博主都想将我的网站嵌入到他们页面的 iframe 中。2)应该非常快 3) 应该尽量减少我服务器上的负载

最佳答案

  • 使用一个表 City 并为每个查询执行 mysql 数学计算,并添加一个缓存层,例如 memcache。性能一般,非常灵活!
  • 使用两个表 City (id,lat,lng,name)Distance (city_id1,city_id2,dist),通过传统的 JOIN 获取结果。 (也可以使用缓存层。)不太灵活。
  • 自定义数据结构:CityObj (id,lat,lng,data[blob]) 只是序列化和压缩城市的 php 数组并存储它。这可能会让您大吃一惊,但正如我们所知,瓶颈从来都不是 CPU 或内存,而是磁盘 IO。这是从 INT 的索引中读取的,与使用 tmp 表的 JOIN 相对应。这不是很灵活,但速度快且可扩展。易于分片和集群。

关于php - 计算最近城市的最有效方法(来自白名单),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7477605/

相关文章:

angular - 将发布请求加载到 angular2 中的 iframe

javascript - 获取包含 # 值的 URL

php - UNION 与带有大 WHERE 子句的两个查询

javascript - 使用助手从用户中检索子集合

html - Overflow-x hidden 在带有 iFrame 的 Google Chrome 中不起作用

javascript - 如何获取 iframe 的innerHTML?

php - wordpress:如何在 wordpress 的 wp_list_table 类中启用编辑和删除操作按钮

php - 使用 PHP 和 curl 设置授权 header

javascript - Firebug Lite 无法在 IE8 中工作 - 访问被拒绝

javascript - R = TypeError : `then` expected a Promise, 收到函数 () { [native code] }