0

最近、プロキシをテストするための簡単な curl プログラムを作成しました。curl の出力が得られた場合、使用しているプロキシは良好です。保存して使用できます。それ以外の場合は、ダウンしているか、ビジー状態などです....

問題は、プロキシのリストをテストすると出力が得られることですが、OK リストから選択した 1 つだけで出力を取得したい場合、事実上ほぼ同じコードを使用しているにもかかわらず、何も得られないことです。ここにあります:

テスト用のコード (まったく同じプロキシをテストしています):

$url='http://google.com';
$curl_imelimit=20;
$allowed_time=19.980;

$file='190.110.86.202:8080
    77.236.209.236:8080
    213.185.231.4:8080
    189.8.32.18:80
    106.51.66.181:80
    190.110.86.22:8080';

preg_match_all('/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,4}/', $file, $proxies);

$options=array(
    CURLOPT_REFERER => 'http://google.com',
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_FOLLOWLOCATION => 3,
    CURLOPT_USERAGENT => null,
    CURLOPT_TIMEOUT => $curl_timelimit,
    CURLOPT_URL => $url,
    CURLOPT_PROXY => $proxy);

foreach($proxies as $pr)
    foreach($pr as $proxy){
        $ch=curl_init();
            curl_setopt_array($ch, $options);
            $output=curl_exec($ch);
            $info=curl_getinfo($ch);
            echo $output.'</br>';
        if ($info['total_time']>0 && $info['total_time']<$allowed_time){
            echo '<p style="color:green;">'.$proxy.' OK</p>';
        }
        if ($info['total_time']==0 || $info['total_time']>$allowed_time)
            echo '<p style="color:red;">'.$proxy.' NOT GOOD</p>';
        set_time_limit(30);
        curl_close($ch);             
    }

すべてのプロキシは時間内に正常に動作し、出力が得られます。上記のリストから 1 つのプロキシを使用してそれを繰り返したい場合、以下のコードを使用しても何も得られません。1 つのプロキシのコード:

$proxy='190.110.86.202:8080';    
$url='http://google.com';
$curl_timelimit=20;                  

$options=array(
    CURLOPT_REFERER => 'http://google.com',
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_FOLLOWLOCATION => 3,
    CURLOPT_USERAGENT => null,
    CURLOPT_TIMEOUT => $curl_timelimit,
    CURLOPT_URL => $url,
    CURLOPT_PROXY => $proxy);    

$ch=curl_init();
    curl_setopt_array($ch, $options);
    $output=curl_exec($ch);
    $info=curl_getinfo($ch);

curl_close($ch);

    echo $output.'</br>';
4

1 に答える 1

0

この十分にテストされた機能を使用できます

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;

また、サーバーでポートがブロックされている場合があるため、プロキシが機能していません

于 2013-10-11T08:21:29.400 に答える