`
jickcai
  • 浏览: 247414 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PHP CURL 代理

    博客分类:
  • php
 
阅读更多

 

<?php

class Proxy_Http {
//use agent
private $agent = '';//代理
    //get or post
private $method = "GET";
//get data from where
private $url;
//parameters post
private $postParam = array();
//referer
private $referer;
//超时
private $timeout = 30;
//cookie
private $cookie;
// 是否直接输出数据,避免内存溢出
private $isDirectOutput = false;

/**
     *设置agent
     *@param
*/
public function setAgent($agent) {
$this->agent = $agent;
    }
/**
     *设置http方法,get,post
     *@param
*/
public function setMethod($method) {
$this->method = $method;
    }
/**
     *设置url
     *@param
*/
public function setUrl($url) {
$this->url = $this->host . $url;
    }
/**
     *@param
*@return
*/
public function setCookie($cookie) {
$this->cookie = "";
foreach($cookie as $key => $value) {
$this->cookie .= "{$key}={$value};";
        }
    }

/**
     * 设置post参数
     * @param array $postParm
     * @return object
     */
public function setPostParam($postParam) {
$this->postParam = self::flattenArr($postParam);
return $this;
    }

/**
     * php://input
     * @param string $input
     * @return object
     */
public function setRawPostParam($input) {
$this->postParam = $input;
return $this;
    }

/**
     * 多维数组转为一维
     *
     * from
     * array(
     *      'list' => array(
     *           array('a' => b, 'c' => 'd')
     *      ),
     * );
     *
     * to
     * array('list[0][a]' => b, 'list[0][c]' => d)
     *
     * @param array $array
     * @param string $prefix
     * @return array
     */
private static function flattenArr($array, $prefix = '') {
$result = array();
foreach ($array as $key => $value) {
$key = $prefix ? $prefix.'['.$key.']' : $key;
if (is_array($value)) {
$result += self::flattenArr($value, $key);
            } else {
$result[$key] = $value;
            }
        }
return $result;
    }

/**
     *设置files
     *@param
*/
public function setFiles($files) {
$fileData = array();
foreach ($files as $key => $file) {
$fileData[$key] = implode(';', array(
'@'.realpath($file['tmp_name']),
'type='.$file['type'],
'filename='.$file['name'],
            ));
        }
$this->postParam = array_merge($fileData, $this->postParam);
    }
/**
     *设置refer
     *@param
*/
public function setReferer($referer) {
$this->referer = $referer;
    }
/**
     *设置headers
     *@param
*/
public function setHeaders($headers) {
$this->headers = $headers;
    }
/**
     *设置超时
     *@param
*/
public function getTimeout($timeout) {
$this->timeout = $timeout;
    }

/**
     * 是否直接输出
     *
     * @param bool $isDirectOutput
     * @return object
     */
public function setDirectOutput($isDirectOutput) {
$this->isDirectOutput = $isDirectOutput;
return $this;
    }

/**
     * 发送请求
     * @param void
     * @return mixed
     */
public function doRequest() {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, !$this->isDirectOutput);
curl_setopt($ch, CURLOPT_URL, $this->url);
curl_setopt($ch, CURLOPT_ENCODING, "gzip");
curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

if (!empty($this->agent)) {
curl_setopt($ch, CURLOPT_USERAGENT,$this->agent);
        }

if (!empty($this->postParam)) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->postParam);
        }

if (!empty($this->referer)) {
curl_setopt($ch, CURLOPT_REFERER , $this->referer);
        }

if ($this->cookie != false){
curl_setopt($ch, CURLOPT_COOKIE, $this->cookie);
        }

if (!empty($this->headers)) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $this->headers);
        }

if ($this->isDirectOutput) {
curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, 'readCurlHeader'));
curl_setopt($ch, CURLOPT_WRITEFUNCTION, array($this, 'readCurlData'));
        }

$response = curl_exec($ch);
if (curl_errno($ch)) {
return false;
        }

$body = '';
if (!$this->isDirectOutput) {
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$this->responseHeader = substr($response, 0, $headerSize);
$this->showHeaders();
$body = substr($response, $headerSize);
        }
curl_close($ch);
return $body;
    }

/**
     * @param object $curl
     * @param string $data
     * @return int
     */
private function readCurlHeader($curl, $header) {
if (!self::isNeedfilter($header)) {
header($header);
        }
return strlen($header);
    }

/**
     * @param object $curl
     * @param string $data
     * @return int
     */
private function readCurlData($curl, $data) {
echo $data;
return strlen($data);
    }

/**
     * @brief 返回reponseheader
     * @param
* @return
*/
public function getResponseHeaders() {
return $this->responseHeader;
    }

/**
     * @breif 绚烂输出的header
     * @param
* @return
*/
public function showHeaders() {
$arrHeader = explode("\r\n", $this->responseHeader);
foreach($arrHeader as $header) {
if (empty($header) || self::isNeedfilter($header)) {
continue;
            }
header($header);
        }
    }

/**
     * 是否需要过滤 header
     *
     * @param string $header
     * @return bool
     */
private static function isNeedfilter($header) {
static $headers = array(
'Connection',
'Content-Encoding',
'Date',
'Server',
'Set-Cookie',
'tracecode',
'Transfer-Encoding',
'Vary',
        );

if (strpos($header, ':') === false) {
return false;
        }

list($key, $value) = explode(':', $header);
if (in_array($key, $headers)) {
return true;
        }

return false;
    }
}


function curlDispatch() {
//转发请求
$urlHelper = new Proxy_Http();
$url = 'http://test.com';
$_GET['name'] = 'aa';
$_GET['id'] = 'test';
if (!empty($_GET)) {
$url .= "?" . http_build_query($_GET);
    }
$urlHelper->setHeaders(array(
"ID:1223",
"name:testname",
    ));
$urlHelper->setUrl($url);
if (!empty($_POST)) {
$urlHelper->setPostParam($_POST);
    }
if (!empty($_FILES)) {
$urlHelper->setFiles($_FILES);
    }
if(!empty($_COOKIE)) {
$urlHelper->setCookie($_COOKIE);
    }
$input = file_get_contents('php://input');
if (!empty($input) && empty($_POST)) {
$urlHelper->setRawPostParam(urlencode($input));
    }

// doRequest 直接输出内容
$needDirectOutput = array(
'file/download',    // 文件下载
);
$controller = '';
$action = '';
//跟进请求的链接判断是否需要输出内容
if (in_array($controller.'/'.$action, $needDirectOutput)) {
$urlHelper->setDirectOutput(true);
    }
$result = $urlHelper->doRequest();
echo $result;die;
}

curlDispatch();
分享到:
评论

相关推荐

    php扩展 php_curl

    3. **高级功能**:`php_curl`支持多种HTTP方法(GET、POST、PUT等),可以设置HTTP头,进行POST数据提交,处理cookies,使用代理服务器,以及进行SSL连接。还可以通过设置选项实现自动重定向、超时控制、错误处理等...

    php下curl用法详解

    在PHP中,cURL库是一个强大的工具,用于执行HTTP和其他协议的请求,它允许开发者模拟浏览器行为,如发送POST请求、处理cookies、设置代理等。本文将深入解析PHP下的cURL用法,以便更好地理解和应用。 1. **初始化...

    php curl nginx 499 错误

    在IT行业中,网络编程是不可或缺的一部分,而PHP的cURL库则是进行HTTP和其他协议请求的常用工具。然而,当我们在使用cURL与服务器交互时,可能会遇到一些异常情况,比如"nginx 499错误"。这个错误通常发生在Nginx...

    php5.3php_curl

    6. **代理支持**:如果需要通过代理服务器访问资源,cURL也可以轻松配置。 7. **自定义头信息**:可以添加自定义的HTTP头信息,如User-Agent、Cookie等。 8. **文件上传与下载**:通过cURL,可以实现文件的上传和...

    PHP CURL 模拟提交(支持代理)

    PHP CURL 模拟提交(支持代理),一个封装好的功能能类,直接调用就好了

    php_curl_使用实例

    ### PHP cURL 使用实例详解 #### 一、cURL简介 cURL 是一款强大的命令行工具,用于通过URL从或向服务器传输数据。cURL 支持多种协议,包括 FTP、FTPS、HTTP、HTTPS、SCP、SFTP、TFTP、TELNET、DICT、FILE 和 LDAP ...

    php实现的Curl封装类

    在PHP开发中,Curl库是一个非常重要的工具,它允许我们执行HTTP请求并获取服务器的响应,支持多种协议,如HTTP、HTTPS、FTP等。为了更方便地使用Curl功能,开发者通常会创建一个Curl封装类,将复杂的Curl设置和调用...

    PHPcurl模拟IP浏览器请求

    PHPcurl模拟IP浏览器请求是通过PHP的cURL扩展来实现的,它允许开发者发送HTTP请求,并自定义各种请求头,包括伪装成不同的浏览器以及设置源IP地址。下面将详细介绍这一技术及其相关知识点。 首先,我们要了解cURL是...

    php的curl整合类.zip

    在PHP开发中,cURL库是一个非常强大的工具,它允许开发者通过HTTP协议与其他网络协议进行交互,例如FTP、SMTP等。这个"php的curl整合类.zip"文件提供了一个封装好的PHP类,使得开发者可以更方便地利用cURL功能,模拟...

    PHP - cURL实现短信验证码注册登录完整示例:PHP - cURL.php和附件说明

    通过cURL,我们可以模拟HTTP请求,发送GET、POST数据,处理cookies,甚至设置代理服务器。 PHP - cURL.php文件是这个示例的核心,它将包含以下主要部分: 1. **初始化cURL**:`$ch = curl_init();` 创建一个cURL...

    PHP CURL详解

    **PHP CURL详解** PHP的CURL库是一种强大的工具,用于在服务器端执行HTTP请求,它支持多种协议,包括HTTP、HTTPS、FTP、FTPS等,是网页抓取、模拟POST和GET请求的重要手段。CURL使得PHP开发者可以方便地与远程...

    PHP通过CURL下载文件

    - **CURL其他常用设置**:除了上述示例中的设置外,还可以通过`curl_setopt()`设置更多选项,如设置超时时间、代理服务器等。 - **文件流处理**:对于较大的文件,可以考虑将下载的内容直接写入到磁盘上,而不是保存...

    PHP封装CURL扩展类.zip

    1. `__construct()`:构造函数,可能用于初始化CURL会话,并设置默认的配置选项,如超时时间、用户代理等。 2. `setopt()`:设置CURL会话的选项,可以传递CURL常量,如`CURLOPT_URL`、`CURLOPT_RETURNTRANSFER`等,...

    php中curl.exe运行文件

    `curl`在数据抓取方面的应用广泛,可以方便地处理JSON、XML等格式的数据,甚至支持HTTPS、代理、cookie等高级功能。通过设置不同的选项,你可以定制请求行为以满足各种需求。 在提供的压缩包中,`curl.7z`是`curl....

    php采用curl访问域名返回405 method not allowed提示的解决方法

    在PHP开发过程中,使用curl库来执行HTTP请求是一项常用的技术,尤其是当需要处理复杂的网络交互时。本文将详细介绍在使用curl访问特定域名时遇到405 Method Not Allowed错误的解决方法。首先,我们先来理解什么是405...

    php中通过curl smtp发送邮件

    在PHP中,当传统的fsockopen函数被禁用或者不可用时,如文中所述的公司云平台关闭了该功能,可以使用cURL库通过SMTP协议发送邮件。cURL是一个强大的库,可以处理多种网络协议,包括SMTP。下面将详细介绍如何使用cURL...

    php的curl多线程采集.zip

    因此,在实际应用中,需要适当控制并发数量,考虑使用代理IP池,以及合理地释放和重用cURL句柄以优化性能。 在标签"类库下载-php的curl多线程采集"中,我们可以理解为可能包含了实现这一功能的相关类库或脚本。在...

    PHP_Curl使用详解.doc

    它通过 cURL 库实现了丰富的功能,包括支持 SSL 证书、POST 数据、PUT 操作、FTP 上传、代理设置、HTTP 重定向等。在 PHP 中使用 Curl,首先需要确保 PHP 安装了 Curl 扩展。如果默认未启用,可以通过复制相关 DLL ...

    curl手册 用curl的

    总的来说,PHP cURL 提供了一种高效且灵活的方式来执行HTTP请求,无论是简单的GET还是复杂的POST,甚至通过代理服务器,都可轻松实现。熟练掌握 cURL 的使用,能够极大地提升你的Web开发能力,特别是在进行数据抓取...

    php应用curl扩展抓取网页类.zip

    在PHP开发中,有时我们需要从远程网站获取数据,如文章内容、标题等,这时我们可以利用cURL(Client URL Library)扩展来实现。`php应用curl扩展抓取网页类.zip`这个压缩包提供了一个PHP类,它封装了cURL功能,方便...

Global site tag (gtag.js) - Google Analytics