Мне нужно использовать JSON, сгенерированный из API этого сайта
Я создал класс PHP для извлечения данных в качестве простейшего решения, основанного здесь, что это:
function ip_details($ip) {
$json = file_get_contents("http://ipinfo.io/{$ip}");
$details = json_decode($json);
return $details;
}
$details = ip_details('8.8.8.8');
echo $details->ip . '<br />';
echo $details->city . '<br />';
echo $details->region . '<br />';
echo $details->country . '<br />';
echo $details->loc . '<br />';
echo $details->hostname . '<br />';
echo $details->org . '<br />';
echo $details->postal . '<br />';
он вообще не работает на моем сервере. Он работает только локально. Я хочу показать, что мой хост отлично работает как с функцией fsockopen() (хотя она ограничена портами 80 и 443), так и библиотекой cURL.
Фактически, я уже использую класс PHP, который отлично работает с cURL, чтобы извлечь все данные, которые мне нужны из файла JSON этого сайта: www.geoplugin.com
Теперь я попытался создать класс PHP самостоятельно, но я делаю некоторые ошибки, которых я не могу найти. Я так много пробовал... Я был на нем 2 дня, но все равно у меня не было никакого решения!
У меня есть файл, я назвал geo.php, где я перезвоню и использую (попробуйте использовать, должен сказать) мой класс, таким образом:
require_once 'geo.class.php';
$geo = new Geolocalize('8.8.8.8');
echo $geo->ip . '<br />';
echo $geo->city . '<br />';
echo $geo->region . '<br />';
echo $geo->country . '<br />';
echo $geo->loc . '<br />';
echo $geo->hostname . '<br />';
echo $geo->org . '<br />';
echo $geo->postal . '<br />';
Вот мой класс. Спасибо всем заранее.
class Geolocalize {
public $host = 'http://ipinfo.io/{IP}';
public $ip;
public $city;
public $region;
public $country;
public $loc;
public $hostname;
public $org;
public $postal;
public function __construct($ip) {
$host = str_replace('{IP}', $ip, $this->host);
$data = array();
$response = $this->fetch($host);
$data = $response;
//set the vars
$this->ip = $data['ip'];
$this->city = $data['city'];
$this->region = $data['region'];
$this->country= $data['country'];
$this->loc = $data['loc'];
$this->hostname = $data['hostname'];
$this->org = $data['org'];
$this->postal = $data['postal'];
}
public function fetch($host) {
if ( function_exists('curl_init') ) {
// use cURL to fetch data
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $host);
// if deactivated (with 0) you see the json from the API
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close ($ch);
} else if ( ini_get('allow_url_fopen') ) {
//fall back to fopen()
$response = file_get_contents($host, 'r');
}
return $response;
}
}
Попробуйте что-то вроде этого:
<?php
class IpInfo
{
protected $apiUrl = 'http://ipinfo.io';
private $ip;
private $city;
private $region;
private $country;
private $loc;
private $hostname;
private $org;
private $postal;
public function __construct($user_ip)
{
// Check if required function exists
if (!function_exists('file_get_contents'))
throw new Exception('file_get_contents php function does not exists');
// Load ip data from remote server
$ip_data = @file_get_contents($this->apiUrl . '/'. $user_ip);
if (empty($ip_data))
throw new Exception('failed to load ip info from remote server');
// Parse ip data
$ip_data = @json_decode($ip_data);
if (!$ip_data)
throw new Exception('failed to parse ip data from remote server response');
else {
$this->ip = $ip_data->ip;
$this->city = $ip_data->city;
$this->region = $ip_data->region;
$this->country = $ip_data->country;
$this->loc = $ip_data->loc;
$this->hostname = $ip_data->hostname;
$this->org = $ip_data->org;
}
}
public function ip() { return $this->ip; }
public function city() { return $this->city; }
public function region() { return $this->region; }
public function country() { return $this->country; }
public function loc() { return $this->loc; }
public function hostname() { return $this->hostname; }
public function org() { return $this->org; }
}
?>
<?php
$user_ip = '74.125.71.138'; // or $_SERVER['REMOTE_ADDR'];
try
{
$ip_info = new IpInfo($user_ip);
echo $ip_info->city(); // Mountain View
}
catch (Exception $ex)
{
echo $ex->getMessage();
}
Я делаю свой класс cURL, но только локально !!!!
Я заметил ошибку, и теперь она работает нормально, но не в Интернете, а не на моем сайте. Вот:
class Geolocalize
{
public $host = 'http://ipinfo.io/{IP}';
public $ip;
public $city;
public $region;
public $country;
public $loc;
public $hostname;
public $org;
public $postal;
public function __construct($ip)
{
$host = str_replace('{IP}', $ip, $this->host);
$response = $this->fetch($host);
// decode the JSON into an associative array, setting the option true
$data = json_decode($response, true);
//set the vars
$this->ip = $data['ip'];
$this->city = $data['city'];
$this->region = $data['region'];
$this->country= $data['country'];
$this->loc = $data['loc'];
$this->hostname = $data['hostname'];
$this->org = $data['org'];
$this->postal = $data['postal'];
}
public function fetch($host)
{
if ( function_exists('curl_init') )
{
// use cURL to fetch data
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $host);
// if deactivated (with 0) you see the json from the API
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close ($ch);
}
else if ( ini_get('allow_url_fopen') )
{
//fall back to fopen()
$response = file_get_contents($host, 'r');
}
return $response;
}
}
то я использую его таким образом, как я сказал выше:
require_once 'geo.class.php';
$geo = new Geolocalize('74.125.71.138'); // 74.125.71.138
echo var_dump($geo->ip) . '<br />';
echo $geo->city . '<br />';
echo $geo->region . '<br />';
echo $geo->country . '<br />';
echo $geo->loc . '<br />';
echo $geo->hostname . '<br />';
echo $geo->org . '<br />';
echo $geo->postal . '<br />';
Как вы видите, я даже пытаюсь поймать ошибки с помощью var_dump(), но я вижу только запись NULL в Production, онлайн.
Угадайте, что это проблема с хостом, который не способен поймать данные из файла JSON. Я попытаюсь связаться с администраторами. Я дам вам знать, если я получу от них новости. Это действительно расстраивает!