Panduan geolokasi IP dengan PHP
Dapatkan negara, kota, dan perkiraan koordinat untuk satu alamat IP dengan PHP.
Mencari alamat IP dengan PHP
Permintaan menerima satu alamat IPv4 atau IPv6 dan meminta JSON. Ganti alamat contoh dengan alamat yang perlu diperiksa.
<?php
$ip = '8.8.8.8'; // Replace with a validated IPv4 or IPv6 address.
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
throw new InvalidArgumentException('Invalid IP address');
}
$url = 'https://api.ipquery.io/' . rawurlencode($ip) . '?format=json';
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 3,
CURLOPT_TIMEOUT => 8,
]);
$body = curl_exec($handle);
$status = curl_getinfo($handle, CURLINFO_HTTP_CODE);
if ($body === false) {
$error = curl_error($handle);
throw new RuntimeException('IP lookup failed: ' . $error);
}
if ($status !== 200) {
throw new RuntimeException('IPQuery returned HTTP ' . $status);
}
$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
if (($data['ip'] ?? null) !== $ip || !isset($data['location']) || !is_array($data['location'])) {
throw new RuntimeException('Unexpected IPQuery response');
}
$location = $data['location'];
$countryCode = strtoupper(trim((string) ($location['country_code'] ?? '')));
$city = trim((string) ($location['city'] ?? ''));
echo 'Country code: ' . ($countryCode ?: 'Unknown') . PHP_EOL;
echo 'City: ' . ($city ?: 'Unknown') . PHP_EOL;
// Coordinates describe an approximate network location, not the user.
$latitude = $location['latitude'] ?? null;
$longitude = $location['longitude'] ?? null;
if (preg_match('/^[A-Z]{2}$/', $countryCode) &&
!in_array($countryCode, ['XX', 'ZZ'], true) &&
is_numeric($latitude) && is_numeric($longitude)) {
printf('Approximate coordinates: %.5f, %.5f%s', $latitude, $longitude, PHP_EOL);
}Memerlukan PHP dengan ekstensi cURL. Batas waktu koneksi adalah tiga detik dan batas waktu keseluruhan permintaan adalah delapan detik.
Membaca kolom lokasi
location.country_code adalah kode negara dua huruf; location.country adalah nama negara. location.city dapat kosong meskipun negaranya diketahui. Tetap perlakukan nilai kosong sebagai tidak diketahui.
location.latitude dan location.longitude adalah perkiraan koordinat lokasi jaringan. Pastikan ada nama lokasi yang dapat digunakan sebelum menampilkannya; koordinat numerik saja tidak memastikan suatu lokasi. Koordinat tersebut tidak mengidentifikasi perangkat atau orang.
Untuk mendapatkan alamat asal permintaan, panggil https://api.ipquery.io/?format=json. Permintaan dari server mengembalikan IP yang digunakan server untuk terhubung; permintaan dari browser mengembalikan alamat koneksinya yang terlihat dari luar.
Akurasi dan keamanan
Geolokasi IP merupakan perkiraan lokasi jaringan, bukan lokasi perangkat. VPN, proxy, jaringan seluler, dan gateway operator dapat menempatkan alamat jauh dari pengguna. Perlakukan nilai yang tidak tersedia sebagai tidak diketahui, bukan mengisinya dengan tebakan.
Jika aplikasi membaca X-Forwarded-For, percayai nilainya hanya jika diberikan oleh proxy yang Anda kendalikan. Header yang diberikan klien dapat dipalsukan. Validasi alamat sebelum melakukan permintaan pencarian dan tangani batas waktu serta kesalahan HTTP secara terpisah dari hasil yang berhasil.
Referensi API