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程序设计有所帮助。