PHP OOP CURL代理错误

时间:2011-02-25 19:46:12

标签: php curl proxy

<?php
class Isis_Expl
{
    const USERAGENT = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13';

    public static $ch;

    public static $proxyType;
    public static $proxy;
    public static $postFields;
    public static $cookie;

    public static function setProxy($proxy, $proxyType = '1')
    {
        self::$proxy = $proxy;
        switch ($proxyType)
        {
            case '4':
                self::$proxyType = 'CURLPROXY_SOCKS4';
                break;
            case '5':
                self::$proxyType = 'CURLPROXY_SOCKS5';
                break;
            default:
                break;
        }
    }

    public static function init($url)
    {
        self::$ch = curl_init();
        curl_setopt(self::$ch, CURLOPT_URL, $url); 
        curl_setopt(self::$ch, CURLOPT_REFERER, $url);        
        curl_setopt(self::$ch, CURLOPT_HEADER, 1);
        curl_setopt(self::$ch, CURLOPT_USERAGENT, self::USERAGENT);
        curl_setopt(self::$ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt(self::$ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt(self::$ch, CURLOPT_TIMEOUT, 15);
        curl_setopt(self::$ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt(self::$ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        self::_getProxy();
        self::_getPost();
        self::_getCookie();

        $content = curl_exec(self::$ch); 

        if (curl_errno(self::$ch))
        {
            echo curl_error(self::$ch);
            return false;
        }
        else
        {
            return $content;
        }
    }

    protected function _getProxy()
    {
        if (self::$proxyType) curl_setopt(self::$ch, CURLOPT_PROXYTYPE, self::$proxyType);        
        if (self::$proxy) curl_setopt(self::$ch, CURLOPT_PROXY, self::$proxy);
    }

    protected function _getPost()
    {
        if (self::$postFields)
        {
            curl_setopt(self::$ch, CURLOPT_POST, 1);
            curl_setopt(self::$ch, CURLOPT_POSTFIELDS, self::$postFields);
        }
    }

    protected function _getCookie()
    {
        if (self::$cookie) curl_setopt(self::$ch, CURLOPT_COOKIE, self::$cookie);
    }   
}

Isis_Expl::setProxy('XXX.XXX.XXX.XXX:XXXX');
echo Isis_Expl::init('http://google.com');

输出:接收失败:重置连接

但如果我评论“//Isis_Expl::setProxy('XXX.XXX.XXX.XXX:XXXX');”输出没问题.. 哪里有问题?

1 个答案:

答案 0 :(得分:2)

首先,当实例更合适时,不要使用静态类。你在这里有州,所以使用一个实例。其次,您可能希望更好地命名您的方法。 _getProxy()我认为会返回一些内容,而不会影响应用的状态。

现在,针对您的确切问题:

  1. 是HTTP代理吗?如果是,您应该将CURLOPT_HTTPPROXYTUNNEL设置为true吗?

  2. 您在proxyType默认声明setProxy为1,但之后您永远不会设置self::$proxyType。你永远不会将CURLOPT_PROXYTYPE设置为CURLPROXY_HTTP(你不应该,但我会明确)。

  3. 您永远不会为代理声明任何身份验证。它是开放代理吗?

  4. 您确定代理实际上正在侦听该IP和端口吗?这是一个非标准的端口...尝试从服务器打开一个连接,看看会发生什么:

    $f  = fsockopen('XXX.XXX.XXX.XXX', 'XXXX');
    if (!$f) die('Server not accepting connections');
    fwrite($f, "q\r\n\r\n");
    var_dump(fread($f, 4048));
    fclose($f);