<?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();
相关推荐
3. **高级功能**:`php_curl`支持多种HTTP方法(GET、POST、PUT等),可以设置HTTP头,进行POST数据提交,处理cookies,使用代理服务器,以及进行SSL连接。还可以通过设置选项实现自动重定向、超时控制、错误处理等...
在PHP中,cURL库是一个强大的工具,用于执行HTTP和其他协议的请求,它允许开发者模拟浏览器行为,如发送POST请求、处理cookies、设置代理等。本文将深入解析PHP下的cURL用法,以便更好地理解和应用。 1. **初始化...
在IT行业中,网络编程是不可或缺的一部分,而PHP的cURL库则是进行HTTP和其他协议请求的常用工具。然而,当我们在使用cURL与服务器交互时,可能会遇到一些异常情况,比如"nginx 499错误"。这个错误通常发生在Nginx...
6. **代理支持**:如果需要通过代理服务器访问资源,cURL也可以轻松配置。 7. **自定义头信息**:可以添加自定义的HTTP头信息,如User-Agent、Cookie等。 8. **文件上传与下载**:通过cURL,可以实现文件的上传和...
PHPcurl模拟IP浏览器请求是通过PHP的cURL扩展来实现的,它允许开发者发送HTTP请求,并自定义各种请求头,包括伪装成不同的浏览器以及设置源IP地址。下面将详细介绍这一技术及其相关知识点。 首先,我们要了解cURL是...
PHP CURL 模拟提交(支持代理),一个封装好的功能能类,直接调用就好了
### PHP cURL 使用实例详解 #### 一、cURL简介 cURL 是一款强大的命令行工具,用于通过URL从或向服务器传输数据。cURL 支持多种协议,包括 FTP、FTPS、HTTP、HTTPS、SCP、SFTP、TFTP、TELNET、DICT、FILE 和 LDAP ...
在PHP开发中,Curl库是一个非常重要的工具,它允许我们执行HTTP请求并获取服务器的响应,支持多种协议,如HTTP、HTTPS、FTP等。为了更方便地使用Curl功能,开发者通常会创建一个Curl封装类,将复杂的Curl设置和调用...
在PHP开发中,cURL库是一个非常强大的工具,它允许开发者通过HTTP协议与其他网络协议进行交互,例如FTP、SMTP等。这个"php的curl整合类.zip"文件提供了一个封装好的PHP类,使得开发者可以更方便地利用cURL功能,模拟...
通过cURL,我们可以模拟HTTP请求,发送GET、POST数据,处理cookies,甚至设置代理服务器。 PHP - cURL.php文件是这个示例的核心,它将包含以下主要部分: 1. **初始化cURL**:`$ch = curl_init();` 创建一个cURL...
**PHP CURL详解** PHP的CURL库是一种强大的工具,用于在服务器端执行HTTP请求,它支持多种协议,包括HTTP、HTTPS、FTP、FTPS等,是网页抓取、模拟POST和GET请求的重要手段。CURL使得PHP开发者可以方便地与远程...
- **CURL其他常用设置**:除了上述示例中的设置外,还可以通过`curl_setopt()`设置更多选项,如设置超时时间、代理服务器等。 - **文件流处理**:对于较大的文件,可以考虑将下载的内容直接写入到磁盘上,而不是保存...
1. `__construct()`:构造函数,可能用于初始化CURL会话,并设置默认的配置选项,如超时时间、用户代理等。 2. `setopt()`:设置CURL会话的选项,可以传递CURL常量,如`CURLOPT_URL`、`CURLOPT_RETURNTRANSFER`等,...
`curl`在数据抓取方面的应用广泛,可以方便地处理JSON、XML等格式的数据,甚至支持HTTPS、代理、cookie等高级功能。通过设置不同的选项,你可以定制请求行为以满足各种需求。 在提供的压缩包中,`curl.7z`是`curl....
在PHP开发过程中,使用curl库来执行HTTP请求是一项常用的技术,尤其是当需要处理复杂的网络交互时。本文将详细介绍在使用curl访问特定域名时遇到405 Method Not Allowed错误的解决方法。首先,我们先来理解什么是405...
在PHP中,当传统的fsockopen函数被禁用或者不可用时,如文中所述的公司云平台关闭了该功能,可以使用cURL库通过SMTP协议发送邮件。cURL是一个强大的库,可以处理多种网络协议,包括SMTP。下面将详细介绍如何使用cURL...
因此,在实际应用中,需要适当控制并发数量,考虑使用代理IP池,以及合理地释放和重用cURL句柄以优化性能。 在标签"类库下载-php的curl多线程采集"中,我们可以理解为可能包含了实现这一功能的相关类库或脚本。在...
它通过 cURL 库实现了丰富的功能,包括支持 SSL 证书、POST 数据、PUT 操作、FTP 上传、代理设置、HTTP 重定向等。在 PHP 中使用 Curl,首先需要确保 PHP 安装了 Curl 扩展。如果默认未启用,可以通过复制相关 DLL ...
总的来说,PHP cURL 提供了一种高效且灵活的方式来执行HTTP请求,无论是简单的GET还是复杂的POST,甚至通过代理服务器,都可轻松实现。熟练掌握 cURL 的使用,能够极大地提升你的Web开发能力,特别是在进行数据抓取...
在PHP开发中,有时我们需要从远程网站获取数据,如文章内容、标题等,这时我们可以利用cURL(Client URL Library)扩展来实现。`php应用curl扩展抓取网页类.zip`这个压缩包提供了一个PHP类,它封装了cURL功能,方便...