คงเว็บไซต์ไว้ใน curl_init() และตั้งตัวกลางบนแฮนเดิลนั้น PHP ต้องมีส่วนขยาย cURL โปรแกรม curl ที่ทำงานในเทอร์มินัลไม่ได้ยืนยันว่าส่วนขยายพร้อมใช้งาน

<?php
$ch = curl_init('https://example.com/');
curl_setopt_array($ch, [
    CURLOPT_PROXY => 'http://203.0.113.10:8080',
    CURLOPT_PROXYTYPE => CURLPROXY_HTTP,
    CURLOPT_NOPROXY => '',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_TIMEOUT => 15,
]);

$body = curl_exec($ch);
if ($body === false) {
    throw new RuntimeException(curl_error($ch), curl_errno($ch));
}

echo curl_getinfo($ch, CURLINFO_RESPONSE_CODE), PHP_EOL;
echo $body;

แทน IP และพอร์ตตัวอย่างในเอกสารด้วยพร็อกซี HTTP ของคุณหรือรายการจากรายการพร็อกซี HTTP CURLOPT_NOPROXY ล้างกฎข้ามพร็อกซีสำหรับการทดสอบนี้ ส่วน CURLOPT_RETURNTRANSFER คืนเนื้อหาแทนการส่งให้เบราว์เซอร์ ขีดจำกัดการเชื่อมต่อจำกัดเวลาตั้งการเชื่อมต่อ และเวลารวมจำกัดการทำงานของ cURL

สำหรับปลายทาง SOCKS5 ให้แทนตัวเลือกพร็อกซี HTTP ก่อน curl_exec():

curl_setopt($ch, CURLOPT_PROXY, '203.0.113.10:1080');
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);

CURLPROXY_SOCKS5_HOSTNAME มอบการจัดการ DNS ปลายทางให้เซิร์ฟเวอร์ SOCKS ใช้โพรโทคอลที่ระบุ พอร์ต 1080 อย่างเดียวบอกชนิดไม่ได้ พร็อกซีทั้งสองแบบไม่จำเป็นต้องปิดการตรวจสอบใบรับรองเว็บไซต์

ตรวจ $body === false อย่างเคร่งครัด เนื้อหาว่างอาจเป็นการส่งข้อมูลสำเร็จ ขณะที่อุโมงค์อาจล้มเหลวก่อนมีการตอบกลับใดจากเว็บไซต์ ในทางกลับกัน เนื้อหาที่ไม่ว่างอาจมาพร้อม 403, 404 หรือ 429 อ่าน CURLINFO_RESPONSE_CODE ร่วมกับผลข้อผิดพลาด cURL เพื่อตัดสินว่าคำขอที่เสร็จแล้วตอบโจทย์งานหรือไม่

บทความที่เกี่ยวข้อง