Оставьте сайт в 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, чтобы решить, выполняет ли завершённый запрос вашу задачу.

Похожие статьи