Comprobar la IP de salida del servidor en ThinkPHP

Autor:Lisa Farrell·2026-06-01

En un proyecto ThinkPHP, una solicitud del servidor a https://my.ipin.io/info comprueba la IP de salida usada al acceder a Internet. Este caso sirve para diagnóstico, revisión de proxies y confirmación de región cloud.

Objetivo de diseño

En «Comprobar la IP de salida del servidor en ThinkPHP», la página debe seguir siendo útil antes de que termine la solicitud IP. El resultado geográfico es una mejora: se valida, se aplica a una decisión limitada y se descarta cuando faltan datos.

Flujo de solicitud y decisión

Comprobar la IP de salida del servidor en ThinkPHP: El flujo siguiente pertenece a esta implementación concreta y no reutiliza una lista genérica de consulta IP.

  1. Paso 1 — Estado predeterminado: OutboundIpService(endpoint)
  2. Paso 2 — Solicitud: connect=1.2s; total=3s
  3. Paso 3 — Validación: ip + country validation
  4. Paso 4 — Decisión: Cache::set(..., 300)
  5. Paso 5 — Reserva: Log::warning context

Ejemplo orientado a producción

Comprobar la IP de salida del servidor en ThinkPHP: El ejemplo incorpora tiempo de espera, validación de respuesta, un valor de reserva determinista y manejo específico del ciclo de vida del framework.

<?php
namespace app\service;

use think\facade\Cache;
use think\facade\Log;

final class OutboundIpService
{
    public function __construct(
        private string $endpoint = 'https://my.ipin.io/info'
    ) {}

    public function lookup(): array
    {
        $fallback = Cache::get('ipin:last_good', [
            'ip' => 'Unknown', 'country' => 'ZZ',
            'region' => '', 'city' => '', 'source' => 'fallback'
        ]);
        $started = microtime(true);
        $ch = curl_init($this->endpoint);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_CONNECTTIMEOUT_MS => 1200,
            CURLOPT_TIMEOUT_MS => 3000,
            CURLOPT_FOLLOWLOCATION => false,
            CURLOPT_HTTPHEADER => ['Accept: application/json'],
            CURLOPT_USERAGENT => 'ipin-outbound-check/1.0',
        ]);

        try {
            $body = curl_exec($ch);
            if ($body === false) {
                throw new \RuntimeException('cURL: '.curl_error($ch));
            }
            $status = (int) curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
            if ($status !== 200) {
                throw new \RuntimeException('HTTP '.$status);
            }
            $data = json_decode($body, true, 32, JSON_THROW_ON_ERROR);
            $ip = filter_var($data['ip'] ?? '', FILTER_VALIDATE_IP,
                FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
            $country = strtoupper((string) ($data['country'] ?? ''));
            if (!$ip || !preg_match('/^[A-Z]{2}$/', $country)) {
                throw new \UnexpectedValueException('Invalid IP payload');
            }
            $result = [
                'ip' => $ip, 'country' => $country,
                'region' => (string) ($data['region'] ?? ''),
                'city' => (string) ($data['city'] ?? ''),
                'source' => 'live',
            ];
            Cache::set('ipin:last_good', $result, 300);
            return $result;
        } catch (\Throwable $e) {
            Log::warning('Outbound IP lookup failed', [
                'message' => $e->getMessage(),
                'duration_ms' => (int) ((microtime(true) - $started) * 1000),
            ]);
            return $fallback;
        } finally {
            curl_close($ch);
        }
    }
}

Matriz de pruebas

Antes de publicar «Comprobar la IP de salida del servidor en ThinkPHP», ejecute estos casos con respuestas simuladas o una salida VPN controlada.

CondiciónEntrada / configuraciónResultado esperado
T1HTTP 200; ip=203.0.113.10; country=JPsource=live; Cache TTL=300
T2egress IP A → Bnew value after TTL
T3cURL error=28source=fallback; Log::warning
T4private IP / country=nullreject; cache unchanged

Prueba automatizada / smoke test

public function test_rejects_incomplete_payload(): void
{
    $service = new OutboundIpService('http://127.0.0.1:9081/missing-country');
    $result = $service->lookup();
    $this->assertSame('fallback', $result['source']);
}

Gestión de fallos

Comprobar la IP de salida del servidor en ThinkPHP: Los fallos deben verse en registros o herramientas de desarrollo, pero nunca dejar un bloque vacío ni romper el proceso de pago.

FalloCausaRespuesta
cURL 6 / 60DNS / CACache:last_good + Log
HTTP 429 / 5xxremote APIshort cache; no request loop
allow_url_fopen=0file_get_contentscURL
proxy IP mismatchegress routeproxy/container network check

Caso práctico

Un uso realista de «Comprobar la IP de salida del servidor en ThinkPHP»: después de mover un servidor API detrás de un nuevo proxy, operaciones compara la IP de salida con la lista permitida de un proveedor y conserva el último valor válido.

Notas de producción

Comprobar la IP de salida del servidor en ThinkPHP: Mantenga completo el HTML predeterminado. La ubicación IP no demuestra identidad y el resultado del navegador no debe controlar permisos.

Conclusión

«Comprobar la IP de salida del servidor en ThinkPHP» ahora tiene una ruta de implementación, pruebas y comportamiento de reserva propios, en lugar de una plantilla compartida.