وب‌سایت را در 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 بخوانید تا مشخص شود درخواست کامل‌شده کار شما را انجام می‌دهد یا نه.

مقالات مرتبط