CURL是一个免费开源的网络传输库支持FTP、HTTP、LDAP等多种传输方式,它存在两套核心接口:单线程传输的阻塞方式和非阻塞方式。
单线程传输的阻塞方式
其使用方式比骄傲简单,其接口也都是前缀为curl_easy_的形式,常见API如下
CURL *curl_easy_init(void); //初始化
CURLcode curl_easy_setopt(CURL *curl,CURLoption,...); //设置传输参数
CURLcode curl_easy_perform(CURL* curl);//执行当前传输
void curl_easy_cleanup(CURL *curl);//清理
在这里我们有必要对CURLcode curl_easy_setopt(CURL *curl,CURLoption)做一个详细的介绍,它通过定义不同的枚举常量传递参数设置。并且它设置的是一个状态值,一次设置后除非修改,否则将保存上次设置的属性。
其中常见属性如下(不足的可以查看API)
CURLOPT_URL //URL地址值
CURLOPT_WRITEFUNCTION //将得到的数据传递给相应的函数里
CURLOPT_WRITEDATA //将函数传递给相应的第四个参数里
CURLOPT_HEADER //如果设置为1,可以返回HTTP头的值,如果设置为非0值,则可以把一个头包含在输出中
CURLOPT_INFILESIZE // 如果你需要上传一个文件到远程站点,这个选项告诉PHP你上传文件的大小
CURLOPT_TIMEOUT //设置一个长整数型,作为最大延续多少秒
CURLOPT_LOW_SPEED_LIMIT //设置一个长整数型,控制传送多少字节
CURLOPT_COOKIE //传递一个包含HTTP Cookie的头文件
CURLOPT_CUSTOMREQUEST //当进行HTTP请求时,传递一个字符被GET和HEAD使用
CURLOPT_FILE //传送的输出文件
CURLOPT_INFILE //传送过来的输出文件
CURLOPT_WRITEHEADER //输出的头部分
CURLOPT_PROXYUSERPWD //传递一个[user]:[psw]格式的字符串去连接HTTP 代理
CURLOPT_POSTFIELDS //传递一个作为HTTP POST操作的所有数据的字符串
CURLOPT_REFERER //在HTTP请求中包含一个referer头的字符串
CURLOPT_USERAGENT //在HTTP请求中包含一个user-agent头的字符串
CURLOPT_FTPPORT //传递一个包含被FTP POST指令使用的IP地址
非阻塞传输
非阻塞传输允许并行地进行多个网络请求,其主要接口如下
CURLM *curl_multi_init(void);
CURLMcode *curl_multi_add_handle(CURLM *multi_handle,CURL *curl_handle); //添加一个传输一个请求
CURLMcode *curl_multi_perform(CURLM* multi_handle,int *running_handles);
CURLMcode *curl_multi_cleanup(CURLM *multi_handle);
非阻塞传输搭建在阻塞传输的基础上,因此也比较简单。
首先,我们利用初始化函数初始化一个CURLM对象
然后初始化若干个CURL对象,并通过
CURLMcode *curl_multi_add_handle(CURLM *multi_handle,CURL *curl_handle)
将其添加到CURLM对象中。
最后我们调用 curl_multi_perform函数即可。