Vérifier l’IP sortante du serveur dans ThinkPHP

Auteur:Lisa Farrell·2026-06-01

Dans un projet ThinkPHP, un appel serveur à https://my.ipin.io/info vérifie l’IP sortante utilisée par le serveur lorsqu’il accède à Internet. Ce cas sert au diagnostic, aux contrôles proxy et à la confirmation de région cloud.

Objectif de conception

Pour « Vérifier l’IP sortante du serveur dans ThinkPHP », la page doit rester utile avant la fin de la requête IP. Le résultat géographique n’est qu’un enrichissement : il est validé, limité à une décision précise et ignoré si les données sont incomplètes.

Flux de requête et de décision

Vérifier l’IP sortante du serveur dans ThinkPHP: Le flux ci-dessous est propre à cette implémentation et ne reprend pas une liste générique de contrôle IP.

  1. Étape 1 — État par défaut: OutboundIpService(endpoint)
  2. Étape 2 — Requête: connect=1.2s; total=3s
  3. Étape 3 — Validation: ip + country validation
  4. Étape 4 — Décision: Cache::set(..., 300)
  5. Étape 5 — Repli: Log::warning context

Exemple orienté production

Vérifier l’IP sortante du serveur dans ThinkPHP: L’exemple ajoute un délai maximal, la validation de la réponse, un repli déterministe et une gestion adaptée au cycle de vie du 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);
        }
    }
}

Matrice de tests

Avant de publier « Vérifier l’IP sortante du serveur dans ThinkPHP », exécutez ces cas avec des réponses simulées ou une sortie VPN contrôlée.

ConditionEntrée / configurationRésultat attendu
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

Test automatisé / 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']);
}

Gestion des échecs

Vérifier l’IP sortante du serveur dans ThinkPHP: Une erreur doit être visible dans les journaux ou les outils de développement, sans laisser un bloc vide ni casser le paiement.

ÉchecCauseRéponse
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

Cas pratique

Un usage réaliste de « Vérifier l’IP sortante du serveur dans ThinkPHP » : après le passage d’un serveur API derrière un nouveau proxy, l’équipe d’exploitation compare l’IP sortante avec la liste blanche d’un partenaire et conserve la dernière valeur valide.

Notes de mise en production

Vérifier l’IP sortante du serveur dans ThinkPHP: Conservez un HTML par défaut complet. La localisation IP ne prouve pas l’identité et ne doit pas servir de contrôle d’autorisation côté client.

Conclusion

« Vérifier l’IP sortante du serveur dans ThinkPHP » dispose désormais de son propre parcours d’implémentation, de tests concrets et d’un comportement de repli défini.