【问题标题】:What is the best way to detect if a proxy server is available?检测代理服务器是否可用的最佳方法是什么?
【发布时间】:2011-01-11 03:50:42
【问题描述】:

我正在尝试编写一个工具来检查代理服务器是否已启动并可供使用。到目前为止,我已经在下面的类中提出了两种方法(我已经删除了对这个问题多余的 setter 和 getter)。

第一种方法使用cURL 并尝试通过代理请求页面,第二种工具使用fsockopen 并尝试打开到代理的连接。

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;
    }
}

到目前为止,我更喜欢cURL 方法,因为它允许我并行检查大量代理,这非常快,而不是像fsockopen 那样一次一个。

我没有对代理做太多工作,所以我很难判断这些方法中的任何一个是否足以验证代理是否可用,或者是否有更好的方法我错过了。

【问题讨论】:

    标签: php curl proxy


    【解决方案1】:

    嗯。尝试通过代理建立与安全(最有可能可用的)URL 的连接,并检查错误,听起来不错。对我来说。

    为了绝对最大的安全性,您可能希望将另一个调用添加到另一个验证 URL(例如 Google 的某些东西),或者进行两次调用,以防万一。

    【讨论】:

    • 第二次可用性检查听起来是个好主意,但发出的请求越多,性能问题就越严重。
    • 是的。我猜这取决于预期用途。
    【解决方案2】:

    cURL 是首选方式,因为 multi_exec。

    我不会费心做两次检查,而是立即拨打 google(或 Proxyjudge)电话。 代理有时可以允许套接字,但不会获取任何东西:因此您的 cURL 方法将是安全的并且不会那么慢。

    正如 Pekka 上面提到的:这取决于预期用途。

    您是否使用 Charon 并获得了大量代理,我希望他们与代理法官核对,我想知道周转时间(以避免代理缓慢)和匿名性。

    如果您想将其用作公司代理的监控系统,我只想确保它可以获取页面。

    一个(混乱的)通过使用 cURL 获取 URL 来检查代理的示例。

    TLDR:使用 cURL,它可以处理并行请求,并且是最稳定的,不会变慢(通过不进行双重检查)。 http://www.oooff.com/php-affiliate-seo-blog/php-automation-coding/easy-php-proxy-checker-writing-tutorial/

    【讨论】:

      猜你喜欢
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 2011-06-16
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多