มีหลายวิธีในการดึง IP Address ของ Server ขึ้นอยู่กับบริบท (Web Request vs CLI Script)
กรณี 1: รันผ่าน Web Server (Apache/Nginx + PHP-FPM)
// IP ของ Server ที่รับ Request (Local IP ของ Server)
$serverIp = $_SERVER['SERVER_ADDR'];
// Port ของ Server
$serverPort = $_SERVER['SERVER_PORT'];
// IP ของ Client (Visitor)
$clientIp = $_SERVER['REMOTE_ADDR'];
// IP จริงของ Client (ถ้าอยู่หลัง Proxy/Load Balancer)
$realClientIp = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'];
// หรือ
$realClientIp = $_SERVER['HTTP_CF_CONNECTING_IP'] ?? $_SERVER['REMOTE_ADDR']; // Cloudflare
กรณี 2: รันผ่าน CLI (Standalone Script)
// Hostname ของเครื่อง
$hostname = gethostname(); // ต้องการ PHP 5.3+
// IP จาก Hostname
$ip = gethostbyname($hostname);
// หาก gethostbyname คืนค่า Hostname เดิม (Resolve ไม่ได้) ให้ลองดู Network Interface
if ($ip === $hostname) {
// Fallback: อ่านจาก Network Interface (Linux)
$output = shell_exec("hostname -I");
$ips = explode(' ', trim($output));
$ip = $ips[0] ?? '127.0.0.1';
}
echo "Hostname: $hostname\n";
echo "Server IP: $ip\n";
กรณี 3: ดึง IP ทุก Network Interface (Linux)
function getAllLocalIps() {
$output = shell_exec("ip -o -4 addr show | awk '{print $4}' | cut -d/ -f1");
return array_filter(array_map('trim', explode("\n", $output)));
}
$ips = getAllLocalIps();
print_r($ips);
// Array ( [0] => 192.168.1.100 [1] => 10.0.0.5 [2] => 172.17.0.1 )
กรณี 4: ดึง Public IP ของ Server (External IP)
function getPublicIp() {
$services = [
'https://api.ipify.org',
'https://ifconfig.me/ip',
'https://icanhazip.com',
];
foreach ($services as $service) {
$ip = @file_get_contents($service);
if ($ip && filter_var(trim($ip), FILTER_VALIDATE_IP)) {
return trim($ip);
}
}
return false;
}
echo "Public IP: " . getPublicIp();
ตารางสรุป: ใช้ตัวไหนดี?
| สถานการณ์ | Variable/Function | หมายเหตุ |
|---|---|---|
| Web Request - Server Local IP | $_SERVER['SERVER_ADDR'] | น่าเชื่อถือที่สุดใน Web Context |
| Web Request - Client IP | $_SERVER['REMOTE_ADDR'] | IP ตรงที่ต่อมาจริง |
| Web Request - Real Client IP (Behind Proxy) | $_SERVER['HTTP_X_FORWARDED_FOR'] | อาจถูก Spoof ต้อง Trust Proxy |
| CLI Script - Local IP | gethostbyname(gethostname()) | PHP 5.3+ |
| CLI Script - All IPs | shell_exec('ip -o -4 addr show') | Linux only |
| Public IP | External API (ipify, ifconfig.me) | ต้องมี Internet |