Bir proxy sunucusu varsa algılamak için en iyi yolu nedir?

2 Cevap php

Ben bir proxy sunucusu ve mevcut kullanım için olup olmadığını kontrol etmek için bir araç yazmaya çalışıyorum. Şimdiye kadar, ben aşağıda sınıfındaki iki yöntem (Ben bu soruya gereksiz olan belirleyiciler ve alıcılar kaldırdık) ile geldim.

İlk yöntem kullandığı cURL ve proxy üzerinden bir sayfa istemek için çalışır, ikinci araç kullandığı fsockopen ve sadece vekil bir bağlantı açmaya çalışır.

class ProxyList {
    /**
     * You could set this to localhost, depending on your environment
     * @var string The URL that the proxy validation method will use to check proxies agains
     * @see ProxyList::validate()
     */
    const VALIDATION_URL = "http://m.www.yahoo.com/robots.txt";
    const TIMEOUT        = 3;

    private static $valid = array(); // Checked and valid proxies
    private $proxies      = array(); // An array of proxies to check

    public function validate($useCache=true) {
        $mh       = curl_multi_init();
        $ch       = null;
        $handles  = array();
        $delay    = count($this->proxies) * 10000;
        $running  = null;
        $proxies  = array();
        $response = null;

        foreach ( $this->proxies as $p ) {
            // Using the cache and the proxy already exists?  Skip the rest of this crap
            if ( $useCache && !empty(self::$valid[$p]) ) {
                $proxies[] = $p;
                continue;
            }

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_HTTP_VERSION,    CURL_HTTP_VERSION_1_1);
            curl_setopt($ch, CURLOPT_URL,             self::VALIDATION_URL);
            curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, true);
            curl_setopt($ch, CURLOPT_PROXY,           $p);
            curl_setopt($ch, CURLOPT_NOBODY,          true); // Also sets request method to HEAD
            curl_setopt($ch, CURLOPT_HEADER,          false);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION,  true);
            curl_setopt($ch, CURLOPT_TIMEOUT,         self::TIMEOUT);

            curl_multi_add_handle($mh, $ch);
            $handles[$p] = $ch;
        }

        // Execute the multi-handle
        do {
            curl_multi_exec($mh, $running);
            usleep($delay);
        } while ( $running );

        // Get the results of the requests
        foreach ( $handles as $proxy => $ch ) {
            $status = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);

            // Great success
            if ( $status >= 200 && $status < 300 ) {
                self::$valid[$proxy] = true;
                $proxies[] = $proxy;
            }
            else {
                self::$valid[$proxy] = false;
            }

            // Cleanup individual handle
            curl_multi_remove_handle($mh, $ch);
        }

        // Cleanup multiple handle
        curl_multi_close($mh);

        return $this->proxies = $proxies;
    }

    public function validate2($useCache=true) {
        $proxies = array();

        foreach ( $this->proxies as $proxy ) {
            // Using the cache and the proxy already exists?  Skip the rest of this crap
            if ( $useCache && !empty(self::$valid[$proxy]) ) {
                $proxies[] = $proxy;
                continue;
            }

            list($host, $post) = explode(":", $proxy);

            if ( $conn = @fsockopen($host, $post, $errno, $error, self::TIMEOUT) ) {
                self::$valid[$proxy] = true;
                $proxies[] = $proxy;
                fclose($conn);
            } else {
                self::$valid[$proxy] = false;
            }
        }

        return $this->proxies = $proxies;
    }
}

Bana yerine fsockopen gibi tek bir seferde, hızlı, kötü olan, paralel vekiller büyük gruplar kontrol sağlar beri Şimdiye kadar, ben cURL yöntemi tercih ediyorum.

Ben proxy ile çok iş yapmadım, bu yüzden bu yöntemlerden birini vekil kullanılabilir olduğunu doğrulamak için yeterli olup olmadığını bana söylemek için çok zor, ya da daha iyi bir yöntem varsa ben eksik olduğunu.

2 Cevap

Hm. Proxy üzerinden güvenli bir (muhtemelen mevcut) URL'ye bir bağlantı kurmaya çalışırken, ve hatalar için kontrol, ok geliyor bana.

Kesinlikle Maksimum güvenlik için, belki başka bir doğrulama URL'ye başka bir çağrı (Google örn. şey) eklemek, ya da sadece durumda, iki çağrı yapmak istiyorum.

cURL nedeniyle multi_exec arasında, tercih edilen bir yoldur.

I wouldn't bother doing two check, but do the google (or a Proxyjudge) call immediately. Proxies sometimes can allow sockets, but just wont fetch a thing: therefore your cURL method would be secure and not that slow.

Pekka Yukarıda söz gibi: amaçlanan kullanıma bağlıdır.

Eğer Charon kullanmak ve vekiller bir yük hasat vermedi, ben onları bir proxyjudge karşı kontrol ve dönüş süresini (yavaş vekiller önlemek için) ve anonimity bilmek istiyorum isterim.

Kurumsal vekiller için bir izleme sistemi olarak kullanmak istiyorsanız, ben sadece bir sayfa getirebilir emin olmak isterim.

cURL ile bir URL getiriliyor üzerinden bir proxy kontrol bir (kaotik) Örnek.

TLDR: use the cURL, it can handle parallel requests and is the most stable without being to slow (by not doing the doublecheck). http://www.oooff.com/php-affiliate-seo-blog/php-automation-coding/easy-php-proxy-checker-writing-tutorial/