PHP实现的CURL非阻塞调用类
本文实例讲述了PHP实现的CURL非阻塞调用类。分享给大家供大家参考,具体如下:
前面一篇《PHP实现非阻塞模式的方法》文章讲述了PHP中实现非阻塞模式,其实如果只是HTTP的话,直接用CURL就能实现。
基于网上的一段代码,修改完善后封装了一个支持POST/GET的非阻塞调用类。
欢迎测试bug~~~~~
/***************************************************** CURL非阻塞调用类 Auther:Linvo Copyright(C)2010/10/21 *******************************************************/ /* //使用范例 //传入参数说明 //url请求地址 //dataPOST方式数据 //并发调用 $param1=array( array( 'url'=>"http://localhost/a.php?s=1", ), array( 'url'=>"http://localhost/a.php?s=1", 'data'=>array('aaa'=>1,'bbb'=>2), ), ); //单个调用 $param2=array( 'url'=>"http://localhost/a.php?s=0", 'data'=>array('aaa'=>1,'bbb'=>2), ); //单个调用(GET简便方式) $param3='http://localhost/a.php?s=2'; $ac=newAsyncCURL(); $ac->set_param($param1); $ret=$ac->send(); //返回值为请求参数顺序的结果数组(元素值为False表示请求错误) var_dump($ret); */ classAsyncCURL { /** *是否需要返回HTTP头信息 */ public$curlopt_header=0; /** *单个CURL调用超时限制 */ public$curlopt_timeout=20; private$param=array(); /** *构造函数(可直接传入请求参数) * *@paramarray可选 *@returnvoid */ publicfunction__construct($param=False) { if($param!==False) { $this->param=$this->init_param($param); } } /** *设置请求参数 * *@paramarray *@returnvoid */ publicfunctionset_param($param) { $this->param=$this->init_param($param); } /** *发送请求 * *@returnarray */ publicfunctionsend() { if(!is_array($this->param)||!count($this->param)) { returnFalse; } $curl=$ret=array(); $handle=curl_multi_init(); foreach($this->paramas$k=>$v) { $param=$this->check_param($v); if(!$param)$curl[$k]=False; else$curl[$k]=$this->add_handle($handle,$param); } $this->exec_handle($handle); foreach($this->paramas$k=>$v) { if($curl[$k]) { $ret[$k]=curl_multi_getcontent($curl[$k]); curl_multi_remove_handle($handle,$curl[$k]); }else{ $ret[$k]=False; } } curl_multi_close($handle); return$ret; } //以下为私有方法 privatefunctioninit_param($param) { $ret=False; if(isset($param['url'])) { $ret=array($param); }else{ $ret=isset($param[0])?$param:False; } return$ret; } privatefunctioncheck_param($param=array()) { $ret=array(); if(is_string($param)) { $url=$param; }else{ extract($param); } if(isset($url)) { $url=trim($url); $url=stripos($url,'http://')===0?$url:NULL; } if(isset($data)&&is_array($data)&&!empty($data)) { $method='POST'; }else{ $method='GET'; unset($data); } if(isset($url))$ret['url']=$url; if(isset($method))$ret['method']=$method; if(isset($data))$ret['data']=$data; $ret=isset($url)?$ret:False; return$ret; } privatefunctionadd_handle($handle,$param) { $curl=curl_init(); curl_setopt($curl,CURLOPT_URL,$param['url']); curl_setopt($curl,CURLOPT_HEADER,$this->curlopt_header); curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); curl_setopt($curl,CURLOPT_TIMEOUT,$this->curlopt_timeout); if($param['method']=='POST') { curl_setopt($curl,CURLOPT_POST,1); curl_setopt($curl,CURLOPT_POSTFIELDS,$param['data']); } curl_multi_add_handle($handle,$curl); return$curl; } privatefunctionexec_handle($handle) { $flag=null; do{ curl_multi_exec($handle,$flag); }while($flag>0); } }
更多关于PHP相关内容感兴趣的读者可查看本站专题:《phpcurl用法总结》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《PHP数据结构与算法教程》及《PHP中json格式数据操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。