Mantén el sitio web en curl_init() y configura el intermediario en ese manejador. PHP necesita su extensión cURL; que el ejecutable curl funcione en la terminal no demuestra que la extensión esté disponible.

<?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;

Sustituye la IP y el puerto de documentación por tu proxy HTTP o una entrada de la lista de proxies HTTP. CURLOPT_NOPROXY borra las reglas de exclusión para esta prueba; CURLOPT_RETURNTRANSFER devuelve el cuerpo en vez de enviarlo al navegador. El límite de conexión acota el establecimiento y el tiempo límite global limita la operación cURL.

Para un punto SOCKS5, sustituye las opciones del proxy HTTP antes de curl_exec():

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

CURLPROXY_SOCKS5_HOSTNAME delega el DNS del destino al servidor SOCKS. Usa el protocolo indicado; el puerto 1080 por sí solo no lo identifica. Ninguna de las dos opciones requiere desactivar la verificación del certificado del sitio.

Comprueba $body === false de forma estricta. Un cuerpo vacío puede ser una transferencia exitosa, mientras que un túnel puede fallar antes de que exista respuesta alguna del sitio. En cambio, un cuerpo no vacío puede acompañar un 403, 404 o 429. Lee CURLINFO_RESPONSE_CODE junto con el resultado de error de cURL para decidir si la solicitud completada cumple tu tarea.

Artículos relacionados