Como verificar o IP de saída do servidor no ThinkPHP

Autor:Lisa Farrell·2026-06-01

Em um projeto ThinkPHP, uma chamada server-side para https://my.ipin.io/info verifica o IP de saída usado pelo servidor ao acessar a internet pública. Esse caso serve para diagnóstico, verificação de proxy e confirmação de região cloud.

Objetivo de projeto

Em “Como verificar o IP de saída do servidor no ThinkPHP”, a página deve continuar útil antes do término da requisição de IP. O resultado geográfico é apenas um aprimoramento: ele é validado, aplicado a uma decisão limitada e descartado quando faltam campos.

Fluxo de requisição e decisão

Como verificar o IP de saída do servidor no ThinkPHP: O fluxo abaixo foi criado para esta implementação específica e não reutiliza uma lista genérica de consulta de IP.

  1. Etapa 1 — Estado padrão: OutboundIpService(endpoint)
  2. Etapa 2 — Requisição: connect=1.2s; total=3s
  3. Etapa 3 — Validação: ip + country validation
  4. Etapa 4 — Decisão: Cache::set(..., 300)
  5. Etapa 5 — Fallback: Log::warning context

Exemplo voltado à produção

Como verificar o IP de saída do servidor no ThinkPHP: O exemplo inclui timeout, validação da resposta, fallback determinístico e tratamento do ciclo de vida específico do 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 testes

Antes de publicar “Como verificar o IP de saída do servidor no ThinkPHP”, execute estes casos com respostas simuladas ou uma saída VPN controlada.

CondiçãoEntrada / configuraçãoResultado 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

Teste automatizado / 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']);
}

Tratamento de falhas

Como verificar o IP de saída do servidor no ThinkPHP: A falha deve aparecer nos logs ou nas ferramentas de desenvolvimento, mas não pode deixar um bloco vazio nem quebrar o checkout.

FalhaCausaResposta
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ático

Um uso realista de “Como verificar o IP de saída do servidor no ThinkPHP”: após mover um servidor de API para trás de um novo proxy, a operação compara o IP de saída com a allowlist de um fornecedor e guarda o último valor válido.

Notas de produção

Como verificar o IP de saída do servidor no ThinkPHP: Mantenha o HTML padrão completo. Localização por IP não comprova identidade e o resultado no navegador não deve controlar autorização.

Conclusão

“Como verificar o IP de saída do servidor no ThinkPHP” agora possui caminho de implementação, testes e fallback próprios, em vez de compartilhar um modelo genérico.