Использование PHP API maxmid GeoIP2 с CodeIgniter
Я пытаюсь использовать GeoIP2 PHP API ( https://github.com/maxmind/GeoIP2-php) в CodeIgniter. Как я могу загрузить GeoIP2 и использовать его для геолокации пользователя?
Я попытался загрузить его так:
$this->load->library("GeoIp2/Database/Reader");
или же
require APPPATH . "libraries/GeoIp2/ProviderInterface.php";
require APPPATH . "libraries/GeoIp2/Database/Reader.php";
или же
$this->load->file("GeoIp2/ProviderInterface");
$this->load->library("GeoIp2/Database/Reader");
Я получаю эту ошибку: "Невозможно загрузить запрошенный файл: ProviderInterface"
Я посмотрел это пространство имен в PHP CodeIgniter Framework, но у меня мало опыта с пространствами имен.
Безуспешно, я не побеждаю, я действительно не знаю, как реализовать это в CodeIgniter.
3 ответа
Я пытался найти решение этого вопроса. Но не удалось найти на stackru. Я пишу свой собственный код здесь. Может быть, это будет кому-то полезно. Я добавил новую функцию в мой файл utility_helper.php:
function get_ip_country_code($ip_address) {
require APPPATH .'third_party/GeoIP2/autoload.php';
$reader = new GeoIp2\Database\Reader(FCPATH.'public/geoip/GeoIP2-Country.mmdb');
$record = $reader->country($ip_address);
return $record->country->isoCode;
}
Я поместил библиотеку GeoIP2 в папку third_party и поместил файл mmdb в общую папку. Он отлично работает для меня. Надеюсь, это сэкономит кому-то время:)
GeoIp2 php sdk использует преимущества пространства имен PHP, которое не поддерживается фреймворком CodeIgniter, поэтому вы получаете сообщение об ошибке при попытке загрузить библиотеку. Пост, на который вы ссылаетесь, предлагает решение с использованием spl_autoload, однако я не использую CodeIgniter и не тестировал его с помощью GeopIp2 php SDK.
Несколько способов вы можете встроить это в CodeIgniter.
Во-первых, вам нужно включить его в скрипт:
require_once( 'GeoIp2/vendor/autoload.php' );
use GeoIp2\Database\Reader;
Далее я звоню Reader()
для методов обнаружения
$reader = new Reader('GeoIp2/GeoIP2-City.mmdb');
$record = $reader->city($ip);
// Country (code)
$record->country->isoCode;
// State
$record->mostSpecificSubdivision->name;
// City
$record->city->name;
// zip code
$record->postal->code;
Я только что проверил это на CodeIgniter 3x и работает.
Я использовал класс бриджа. внутри /application/libraries
создать файл с именем CI_GeoIp2.php
и добавьте следующий код.
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* GeoIp2 Class
*
* @package CodeIgniter
* @subpackage Libraries
* @category GeoIp2
* @author Timothy Marois <timothymarois@gmail.com>
*/
require_once( APPPATH . 'third_party/GeoIp2/vendor/autoload.php' );
use GeoIp2\Database\Reader;
class CI_GeoIp2 {
protected $record;
protected $database_path = 'third_party/GeoIp2/GeoIP2-City.mmdb';
public function __construct() {
$ci =& get_instance();
$reader = new Reader(APPPATH.$this->database_path);
$ip = $ci->input->ip_address();
if ($ci->input->valid_ip($ip)) {
$this->record = $reader->city($ip);
}
log_message('debug', "CI_GeoIp2 Class Initialized");
}
/**
* getState()
* @return state
*/
public function getState() {
return $this->record->mostSpecificSubdivision->name;;
}
/**
* getState()
* @return country code "US/CA etc"
*/
public function getCountryCode() {
return $this->record->country->isoCode;
}
/**
* getCity()
* @return city name
*/
public function getCity() {
return $this->record->city->name;
}
/**
* getZipCode()
* @return Zip Code (#)
*/
public function getZipCode() {
return $this->record->postal->code;
}
/**
* getRawRecord()
* (if you want to manually extract objects)
*
* @return object of all items
*/
public function getRawRecord() {
return $this->record;
}
}
Теперь вы можете либо автоматически загрузить, либо загрузить его с помощью
$this->load->library("CI_GeoIp2");
Я предпочитаю его автозагрузку в конфиге autoload.php
$autoload['libraries'] = array('CI_GeoIp2'=>'Location');
Так что в сценарии, который я использую,
$this->Location->getState()
$this->Location->getCity()
... и так далее