2011-01-26 2 views
4

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

Proxy используется для испытаний: 75.147.173.215:8080

+0

Почему бы не кэшировать результаты, а не мошенничество? –

ответ

1

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

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

UPDATE:

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

Код я использовал:

$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; 
+0

У меня есть список из 10k прокси-серверов ... это нереально, чтобы проверить это так. – ZombieDragon

+0

Просто начните с одного из них, убедитесь, что он работает с браузером, а затем попытайтесь заставить его работать из вашего скрипта. После этого попробуйте работать со всеми прокси-серверами 10k. – Kel

+0

Кроме того, некоторые веб-сайты блокируют доступ к некоторым общедоступным прокси, поскольку они часто используются для атак. – Kel

2

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

$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); 

} 
0

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


Существует много раз, когда порты, отличные от 80, блокируются сер ver, поэтому код работает нормально на локальном хосте, но не на сервере, попробуйте использовать прокси-сервер порта 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; 
} 
Смежные вопросы