注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 

日志

 
 

一个简单的php curl hander  

2012-09-20 12:03:01|  分类: Web技术-Php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 在本篇文章中,我们将实现一个简单的curl hander(即封装一个curl类)。至于什么是CURL请参看: http://fc-lamp.blog.163.com/blog/static/174566687200981011390421/    或者google。

先上代码

<?php
/**
*
* Curl处理器
* @author fc_lamp
* @internal
* 支持cookie
*/
class curlHander
{
public $option = array ();
public $header = array ('Accept-Language: zh-cn', 'Connection: Keep-Alive', 'Cache-Control: no-cache' );
public $agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.79 Safari/537.1';
private $_ch;
private $_cookieFile;
public function __construct()
{
$this->_ch = curl_init ();
$tmp = ini_get ( 'upload_tmp_dir' );
$this->_cookieFile = tempnam ( $tmp, 'cookie' );
}

/**
*
* 实现POST方法
* @param $url 请求的地址
* @param $data 关联数组:array('test'=>'one','two'=>'bb')
* @param $response_header 是否要求返回响应头
*/
public function post($url, $data, $response_header = False)
{
$this->option [CURLOPT_URL] = $url; //请求地址
$this->option [CURLOPT_POST] = True;
$this->option [CURLOPT_POSTFIELDS] = http_build_query ( $data );
if ($response_header)
{
$this->option [CURLOPT_HEADER] = True; //输出包含Header信息
}
$this->_set_option ();
$response = curl_exec ( $this->_ch );
if ($response === False)
{
throw new Exception ( curl_error ( $this->_ch ) );
}
return $response_header ? $this->_parse_response ( $response ) : $response;
}

/**
*
* 实现GET方法
* @param $url 请求的地址
* @param $response_header 是否要求返回响应头
*/
public function get($url, $response_header = False)
{
$this->option [CURLOPT_URL] = $url; //请求地址
if ($response_header)
{
$this->option [CURLOPT_HEADER] = True; //输出包含Header信息
}
$this->_set_option ();
$response = curl_exec ( $this->_ch );
if ($response === False)
{
throw new Exception ( curl_error ( $this->_ch ) );
}
return $response_header ? $this->_parse_response ( $response ) : $response;

}

/**
*
* 关闭链接,释放资源
*/
public function close()
{
curl_close ( $this->_ch );
$this->_ch = Null;
}

/**
*
* 解析出结果
* @param unknown_type $response
*/
private function _parse_response($response)
{
$response = explode ( "\r\n\r\n", $response );
$header = reset ( $response );
array_shift ( $response );
$body = implode ( "\r\n\r\n", $response );
return array ('header' => $header, 'body' => $body );
}

/**
*
* 合并设置
*/
private function _set_option()
{
$array = array (
CURLOPT_HTTPHEADER => $this->header,
CURLOPT_USERAGENT => $this->agent,
CURLOPT_COOKIEJAR => $this->_cookieFile,
CURLOPT_COOKIEFILE => $this->_cookieFile,
CURLOPT_RETURNTRANSFER => True //不直接输出
);
$this->option = $array + $this->option;
curl_setopt_array ( $this->_ch, $this->option );
}
}

说明:
 curlHander只实现了网络请求的最常用的两个方法POST和GET,其它方法(如HEADER)方法请自行实现。
另外curl中的option在这里你是可以任意加的,方法为:实例化curlHander后,在调用任意方法之前设置OPTION: 
$ch->option[CURLOPT_HTTPAUTH] =  CURLAUTH_BASIC;

使用实例:
1简单实例
  

$ch = new curlHander ();
$url = 'http://localhost/test/test.php';
//POST方法
//输出的信息里有响应头 array('header'=>'xxx','body'=>'xxx')
$res = $ch->post ($url,array ('test1' => 1, 'test2' => 2 ),true);

//只返回主体信息
$res = $ch->post ($url,array ('test1' => 1, 'test2' => 2 ) );


//GET方法
$res = $ch->get($url);


2 实战(登录认证问题): 在这里我们使用模拟登录discuz,来看看是否可用(注意这里没有验证码)。

$ch = new curlHander();
//注意如果对方的是:https,则需要单独设置一下
//$ch->option[CURLOPT_SSL_VERIFYHOST] = 0;
//$ch->option[CURLOPT_SSL_VERIFYPEER] = 0;


//获取相应的formhash和cookie
$url = 'http://www.discuz.net/member.php?mod=logging&action=login&infloat=yes&handlekey=login&inajax=1&ajaxtarget=fwin_content_login';
$res = $ch->get($url);
preg_match('/.*?name="formhash".*?value="(.*?)".*?/',$res,$formhash);
$formhash = end($formhash);
$login_url = 'http://www.discuz.net/member.php?mod=logging&action=login&loginsubmit=yes&handlekey=login&loginhash=LCaB3&inajax=1';
//准备登录的数据
$post = array(
'answer'=>'',
'formhash'=>$formhash,
'password'=>'你的密码',
'questionid'=>0,
'referer'=>'http://www.discuz.net/',
'username'=>'你的用户名'
);
$res = $ch->post ($login_url, $post);
var_dump ( $res );

以上代码执行后,可看到如下结果:

一个简单的php curl hander - fc_lamp - @fc_lamp
 
  评论这张
 
阅读(960)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017