прокрутка через прокси не возвращает содержимого - PullRequest
5 голосов
/ 26 января 2011

Я сейчас работаю над сценарием PHP, который отправляет запросы на серверы нашей школы, чтобы в режиме реального времени получать информацию о размерах классов для разных курсов.Скрипт работает отлично, когда я не использую прокси, возвращая строку, полную номеров курсов и доступных мест.Тем не менее, я хочу сделать эту услугу для студентов, и я боюсь, что если я сделаю слишком много запросов, мой ip будет заблокирован.Поэтому я пытаюсь сделать это через прокси, но безуспешно.Как только я добавляю поля CURLOPT_HTTPPROXYTUNNEL и CURLOPT_PROXY к моим запросам, ничего не возвращается.Я даже не уверен, как устранить неполадки на этом этапе, так как я не получаю сообщение об ошибке какого-либо рода.Кто-нибудь знает, что происходит или как по крайней мере устранить неполадки?

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$proxy = explode(':', $proxy);
curl_setopt($ch, CURLOPT_PROXY, $proxy[0]);
curl_setopt($ch, CURLOPT_PROXYPORT, $proxy[1]);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'tempcookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'tempcookie.txt');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_REFERER, $ref);
$exec = curl_exec($ch);

echo curl_error($ch);
print_r(curl_getinfo($ch));
echo $exec;

Прокси, используемый для тестов: 75.147.173.215:8080

Ответы [ 3 ]

2 голосов
/ 25 сентября 2012

Я использую следующий код, если мне нужно использовать прокси с curl:

$proxy = "127.0.0.1:8080"; // or something like that

if($proxy !== null){

    // no need to specify PROXYPORT again
    curl_setopt($ch, CURLOPT_PROXY, $proxy);

    // to make the request go through as though proxy didn't exist
    curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 0);

}
1 голос
/ 21 октября 2013

Вот хорошо протестированная функция, которую я использовал для своих проектов с подробными поясняющими комментариями


Часто порты, отличные от 80, блокируются брандмауэром сервера, поэтому код работает нормально на локальном хосте, но не на сервере, попробуйте использовать прокси порта 80

function get_page($url){

global $proxy;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_HEADER, 0); // return headers 0 no 1 yes
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // return page 1:yes
curl_setopt($ch, CURLOPT_TIMEOUT, 200); // http request timeout 20 seconds
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Follow redirects, need this if the url changes
curl_setopt($ch, CURLOPT_MAXREDIRS, 2); //if http server gives redirection responce
curl_setopt($ch, CURLOPT_USERAGENT,
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt"); // cookies storage / here the changes have been made
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // false for https
curl_setopt($ch, CURLOPT_ENCODING, "gzip"); // the page encoding

$data = curl_exec($ch); // execute the http request
curl_close($ch); // close the connection
return $data;
}
1 голос
/ 26 января 2011

Вы можете установить CURLOPT_STDERR и CURLOPT_VERBOSE параметры скручивания , чтобы сохранить ваши ошибки в файле. Также вы можете использовать функцию curl_error () . Кстати, по умолчанию curl должен показывать все ошибки в STDERR.

Кроме того, для общей проверки вы можете просто указать выбранный прокси в свойствах конфигурации вашего браузера, попробовать открыть конкретную службу в браузере и посмотреть, возвращается ли правильный ответ.

UPDATE:

CURLOPT_HTTPPROXYTUNNEL используется для вызова метода curl CONNECT HTTP при запросе прокси-сервера (подробности см. здесь ). Я тестировал код без этой опции - он работал успешно.

Код, который я использовал:

$proxy = "75.147.173.215:8080";
$proxy = explode(':', $proxy);
$url = "http://google.com";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXY, $proxy[0]);
curl_setopt($ch, CURLOPT_PROXYPORT, $proxy[1]);
curl_setopt($ch, CURLOPT_HEADER, 1);

$exec = curl_exec($ch);

echo curl_error($ch);
print_r(curl_getinfo($ch));
echo $exec;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...