השאירו את האתר ב־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 כדי להחליט אם הבקשה שהסתיימה משרתת את המשימה.

מאמרים קשורים