Cách kiểm tra IP đầu ra của máy chủ trong ThinkPHP

Tác giả:Lisa Farrell·2026-06-01

Trong dự án ThinkPHP, request phía server tới https://my.ipin.io/info dùng để kiểm tra IP đầu ra khi máy chủ truy cập Internet công cộng. Trường hợp này phù hợp cho chẩn đoán vận hành, kiểm tra proxy và xác nhận khu vực cloud.

Mục tiêu thiết kế

Với “Cách kiểm tra IP đầu ra của máy chủ trong ThinkPHP”, trang phải hữu ích ngay cả trước khi request IP hoàn tất. Kết quả vị trí chỉ là lớp tăng cường: dữ liệu được kiểm tra, chỉ tác động đến một quyết định giới hạn và bị bỏ qua nếu thiếu trường.

Luồng request và quyết định

Cách kiểm tra IP đầu ra của máy chủ trong ThinkPHP: Luồng dưới đây được thiết kế riêng cho cách triển khai này, không lặp lại checklist tra cứu IP chung.

  1. Bước 1 — Trạng thái mặc định: OutboundIpService(endpoint)
  2. Bước 2 — Request: connect=1.2s; total=3s
  3. Bước 3 — Kiểm tra: ip + country validation
  4. Bước 4 — Quyết định: Cache::set(..., 300)
  5. Bước 5 — Dự phòng: Log::warning context

Ví dụ hướng đến production

Cách kiểm tra IP đầu ra của máy chủ trong ThinkPHP: Ví dụ bổ sung timeout, kiểm tra response, phương án dự phòng xác định và xử lý vòng đời phù hợp với 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);
        }
    }
}

Ma trận kiểm thử

Trước khi xuất bản “Cách kiểm tra IP đầu ra của máy chủ trong ThinkPHP”, hãy chạy các trường hợp sau bằng response giả lập hoặc điểm thoát VPN có kiểm soát.

Điều kiệnĐầu vào / thiết lậpKết quả mong đợi
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

Kiểm thử tự động / 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']);
}

Xử lý lỗi

Cách kiểm tra IP đầu ra của máy chủ trong ThinkPHP: Lỗi cần xuất hiện trong log hoặc công cụ dành cho nhà phát triển, nhưng không được để lại module trống hay làm hỏng trang thanh toán.

LỗiNguyên nhânCách xử lý
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

Tình huống thực tế

Một tình huống thực tế cho “Cách kiểm tra IP đầu ra của máy chủ trong ThinkPHP”: sau khi chuyển API server ra sau proxy mới, nhóm vận hành so sánh IP đầu ra với allowlist của đối tác và lưu giá trị hợp lệ gần nhất.

Lưu ý khi triển khai

Cách kiểm tra IP đầu ra của máy chủ trong ThinkPHP: Giữ HTML mặc định đầy đủ. Vị trí IP không chứng minh danh tính và kết quả phía trình duyệt không được dùng để kiểm soát quyền.

Kết luận

“Cách kiểm tra IP đầu ra của máy chủ trong ThinkPHP” hiện có luồng triển khai, bằng chứng kiểm thử và hành vi dự phòng riêng thay vì dùng chung một mẫu bài viết.