Използвайте прокси IP с PHP cURL
Настройте HTTP или SOCKS прокси върху PHP cURL handle, дръжте URL адреса на сайта отделно и различавайте транспортни грешки от HTTP отговори.
Оставете сайта в curl_init() и задайте посредника върху този handle. 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, за да прецените дали завършената заявка служи на задачата ви.