Laravel 4 的 GeoIP 仅显示示例数据

Posted

技术标签:

【中文标题】Laravel 4 的 GeoIP 仅显示示例数据【英文标题】:GeoIP for Laravel 4 shows only example data 【发布时间】:2014-11-07 23:08:54 【问题描述】:

我已经用 Laravel 4 安装了 GeoIP (Torann/laravel-4-geoip)。我已经下载了 MaxMind GeoLite2 City mmdb 数据文件,并按照说明将它放在 app/database/maxmind 中。

我的基本代码如下,但它总是显示示例数据而不是实际值。

$loc = GeoIP::getLocation();
print_r($loc);

每次我得到这个:

Array ( [ip] => ::1 [isoCode] => US [country] => United States [city] => New Haven [state] => CT [postal_code] => 06510 [lat] => 41.31 [lon] => -72.92 [timezone] => America/New_York [continent] => NA [default] => 1 )

我没有对配置文件进行任何更改,它仍然是这样的:

return array(

  // Service (only maxmind so far)
  'service' => 'maxmind',

  'maxmind' => array(
    'type'          => 'database', // database or web_service
    'user_id'       => '',
    'license_key'   => ''
  )
);

【问题讨论】:

【参考方案1】:

getLocation 方法要求您传递一个 IP 地址,它将返回该 IP 的位置详细信息。例如使用这个属于 Google 的 IP 地址:

GeoIP::getLocation('64.233.191.128');

你会得到这些数据:

array(
  "ip"          => "64.233.191.128"
  "isoCode"     => "US"
  "country"     => "United States"
  "city"        => "Mountain View"
  "state"       => "CA"
  "postal_code" => 94043
  "lat"         => 37.4192
  "lon"         => -122.0574
  "default"     => false
)

注意

在本地服务器上进行测试时,在没有 IP 的情况下调用 GeoIP::getLocation() 将不起作用,因为本地 IP 不是公共的。

【讨论】:

根据文档,听起来好像只使用 GeoIP::GetLocation() 将“获取网站访问者的位置数据” - 所以我认为您不必将 IP 传递给它。当我尝试使用 GeoIP::getLocation('64.233.191.128') - 使用 IP 地址时,即使是那个 IP 地址,也没有响应,也没有错误。奇怪的是它甚至没有在同一个 php 脚本分隔符中完成任何其他代码。 你是否有机会在本地测试这个? 我正在使用 XAMPP 在我的本地机器上进行测试 那是您的问题,localhost127.0.0.1 无法返回任何有效数据,因为它不是公共 IP 地址,而这正是 GeoIP 在您尝试获取数据的 IP在没有 IP 地址的情况下调用它。 但是如果我提供一个 IP 地址,它应该可以工作,不是吗?如果使用 GeoIP::getLocation('64.233.191.128');例如?甚至在本地运行?【参考方案2】:

Bogdan 帮我解决了这个问题 - 在将模板移入模型并通过控制器传递之前,我在模板中进行了快速测试。一旦我移动它,事情就开始起作用了。

只使用 GeoIP::getLocation(); 在我的本地服务器上不起作用所以我现在正在做的就是用这个进行测试:

$ip  = '173.234.149.140';  //la
$loc = \GeoIP::getLocation($ip);

一旦在实时服务器上,我应该能够从客户端获取实际 IP。最终,我拉扯了经纬度,并从我自己的商店位置数据库中找到最近的商店位置,然后使用 Haversine mysql 公式找到最接近的位置,如下所示:

$lat = $loc['lat'];
$lng = $loc['lon'];
$results = \DB::select( \DB::raw("SELECT  id, ( 3959 * acos( cos( radians($lat) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians($lng) ) + sin( radians($lat) ) * sin( radians( lat ) ) ) ) AS distance FROM locations HAVING distance < 500 ORDER BY distance LIMIT 0 , 20;"));

【讨论】:

它可以在本地主机上工作吗?还是需要实时服务器来运行此代码? 没有理由不这样做。

以上是关于Laravel 4 的 GeoIP 仅显示示例数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.1 GeoIP 非静态方法不应被静态调用,假设 $this 来自不兼容的上下文

Vue-Router 仅显示使用 Laravel Blade 的基本路由?

基于 Geoip 隐藏多个元素

Laravel 分页显示重复和替换随机行

如何在需要时仅提交隐藏/显示字段数据之一 - Laravel

Laravel 5.4 上的示例 PHPUnit 测试失败并显示 404