Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> PHP

ระบุ IP Address ของ Server ใน PHP

มีหลายวิธีในการดึง 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 IPgethostbyname(gethostname())PHP 5.3+
CLI Script - All IPsshell_exec('ip -o -4 addr show')Linux only
Public IPExternal API (ipify, ifconfig.me)ต้องมี Internet