cURL请求的基本步骤:
$ch = curl_init(); //1)初始化
curl_setopt($ch,CURLOPT_URL,"http://www.php.net"); //2)设置选项,包括URL
$output = curl_exec($ch); //3)执行并获取HTML文档文件
curl_close($ch) //4)释放cURL句柄
if(curl_exec($ch) === FALSE) 检测是否有错误
curl_getinfo() 返回cURL执行后这一个请求相关信息(用于调试和排错)
curl_setopt()函数的参数(玄妙之籍),指定URL请求的各个细节。参数讲解:
CURLOPT_AUTOREFERER: 当根据location:重定向时,自动设置header中的Referer信息
CURLOPT_COOKIESESSION: 启用时cURL会仅仅传递一个Session Cookie,忽略其他Cookie,默认状况下cURL会将所有Cookie返回给服务器端。Session Cookie指用来判断服务器端的Session是否有效的存在Cookie
CURLOPT_FOLLOWLOCATION: 启用将服务器返回的"Location:"放在header中,递归地返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
CURLOPT_HEADER:启用将头文件的信息作为数据流输出
CURLOPT_RETURNTRANSFER:将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
$ch = curl_init(); //1)初始化
curl_setopt($ch,CURLOPT_URL,"http://www.php.net"); //2)设置选项,包括URL
$output = curl_exec($ch); //3)执行并获取HTML文档文件
curl_close($ch) //4)释放cURL句柄
if(curl_exec($ch) === FALSE) 检测是否有错误
curl_getinfo() 返回cURL执行后这一个请求相关信息(用于调试和排错)
curl_setopt()函数的参数(玄妙之籍),指定URL请求的各个细节。参数讲解:
CURLOPT_AUTOREFERER: 当根据location:重定向时,自动设置header中的Referer信息
CURLOPT_COOKIESESSION: 启用时cURL会仅仅传递一个Session Cookie,忽略其他Cookie,默认状况下cURL会将所有Cookie返回给服务器端。Session Cookie指用来判断服务器端的Session是否有效的存在Cookie
CURLOPT_FOLLOWLOCATION: 启用将服务器返回的"Location:"放在header中,递归地返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
CURLOPT_HEADER:启用将头文件的信息作为数据流输出
CURLOPT_RETURNTRANSFER:将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
CURLOPT_INFILESIZE:设定上传文件的大小,单位为字节(byte)
CURLOPT_MAXCONNECTS:允许的最大连接数量,超过会通过CURLOPT_CLOSEPOLICY决定应该停止哪些连接
CURLOPT_MAXREDIRS:指定HTTP重定向的最多数量,和CURLOPT_FOLLOWLOCATION一起使用
CURLOPT_COOKIE:设定HTTP请求中”Cookie“部分的内容,多个Cookie用分号分隔,分号后带一个空格(例如:”fruit = apple; colour = red“)
CURLOPT_COOKIEFILE:包含Cookie数据的文件名,Cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
CURLOPT_COOKIEJAR:连接结束后保存Cookie信息的文件。
CURLOPT_ENCODING:HTTP请求头中"Accept-Encoding"的值。支持的编码有”identity“,”deflate“和”gzip“。如果为空字符串”“,请求头会发送所有支持的编码类型
CURLOPT_POSTFIELDS:全部数据使用HTTP协议中的”POST“操作来发送。要发送文件,在文件名前面加上@前缀并使用完整路径。这个参数通过urlencoded后的字符串类似‘paral = vall¶2 = val2&...’或使用一个以字段名为键值,字段数据为值得数据。如果value是一个数组,Content-Type头将会被设置成multipart/form-data
CURLOPT_RANGE:以”X-Y“的形式组成,其中X和Y都是可选项获取数据的范围,单位是字节。HTTP传输线程也支持几个这样的重复项中间用逗号分隔如”X-Y,N-M“
CURLOPT_REFERER:HTTP请求头中”Referer“的内容
CURLOPT_HTTPHEADER:用来设置HTTP头字段的数组。数组形式如下:array('Content-type:text/plain','Content-length:100')
CURLOPT_FILE:设置输出文件的位置,值是一个资源类型,默认为STDOUT(浏览器)
CURLOPT_INFILE:在上传文件的时候需要读取的文件地址,值是一个资源类型
CURLOPT_HEADERFUNCTION:设置一个回调函数,其有两个参数:第一个是cURL的资源句柄,第二个是输出的header数据。header数据的输出必须依赖这个函数,返回已写入的数据大小。
CURLOPT_WRITEFUNCTION:拥有两个参数的回调函数:第一个是参数是会话句柄,第二个是HTTP响应头信息的字符串。使用此回调函数,将自行处理响应头信息。响应头信息是整个字符串。设置返回值为精确地已写入字符串长度。发生错误时传输线程终止。(如果觉得这个函数设置起来比较麻烦,使用curl_setopt_array函数可把所有设置项作为一个数组穿进去设置。)
在cURL中伪造头信息
<?php
@header('Content-type:text/html;charset = utf-8');
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,"http://3g.qq.com");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //将curl_exec()获取的信息以文件流的形式返回(不直接输出)
$h = array('HTTP_VIA:HTTP/1.1 SNXA-PS-WAP-GW21 (infoX-WISG,huawei Technologies)','HTTP_ACCEPT:application/vnd.wap.wmlscripts,text/vnd.wap.wml,application/vnd.wap.xhtml + xml,');
curl_setopt($ch,CURLOPT_HEADER,$h);
$output = culr_exec($ch);
curl_close($ch);
?>
在cURL中用POST方法发送数据
$post_data = array("foo"=>"bar","query"=>"php","action"=>"Submit");
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,1); //设置为POST
curl_setopt($ch,CURLOPT_POSTFIELDS,$post_data ); //把POST的变量加上
$output = curl_exec($ch);
curl_close($ch);
CURLOPT_MAXCONNECTS:允许的最大连接数量,超过会通过CURLOPT_CLOSEPOLICY决定应该停止哪些连接
CURLOPT_MAXREDIRS:指定HTTP重定向的最多数量,和CURLOPT_FOLLOWLOCATION一起使用
CURLOPT_COOKIE:设定HTTP请求中”Cookie“部分的内容,多个Cookie用分号分隔,分号后带一个空格(例如:”fruit = apple; colour = red“)
CURLOPT_COOKIEFILE:包含Cookie数据的文件名,Cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
CURLOPT_COOKIEJAR:连接结束后保存Cookie信息的文件。
CURLOPT_ENCODING:HTTP请求头中"Accept-Encoding"的值。支持的编码有”identity“,”deflate“和”gzip“。如果为空字符串”“,请求头会发送所有支持的编码类型
CURLOPT_POSTFIELDS:全部数据使用HTTP协议中的”POST“操作来发送。要发送文件,在文件名前面加上@前缀并使用完整路径。这个参数通过urlencoded后的字符串类似‘paral = vall¶2 = val2&...’或使用一个以字段名为键值,字段数据为值得数据。如果value是一个数组,Content-Type头将会被设置成multipart/form-data
CURLOPT_RANGE:以”X-Y“的形式组成,其中X和Y都是可选项获取数据的范围,单位是字节。HTTP传输线程也支持几个这样的重复项中间用逗号分隔如”X-Y,N-M“
CURLOPT_REFERER:HTTP请求头中”Referer“的内容
CURLOPT_HTTPHEADER:用来设置HTTP头字段的数组。数组形式如下:array('Content-type:text/plain','Content-length:100')
CURLOPT_FILE:设置输出文件的位置,值是一个资源类型,默认为STDOUT(浏览器)
CURLOPT_INFILE:在上传文件的时候需要读取的文件地址,值是一个资源类型
CURLOPT_HEADERFUNCTION:设置一个回调函数,其有两个参数:第一个是cURL的资源句柄,第二个是输出的header数据。header数据的输出必须依赖这个函数,返回已写入的数据大小。
CURLOPT_WRITEFUNCTION:拥有两个参数的回调函数:第一个是参数是会话句柄,第二个是HTTP响应头信息的字符串。使用此回调函数,将自行处理响应头信息。响应头信息是整个字符串。设置返回值为精确地已写入字符串长度。发生错误时传输线程终止。(如果觉得这个函数设置起来比较麻烦,使用curl_setopt_array函数可把所有设置项作为一个数组穿进去设置。)
在cURL中伪造头信息
<?php
@header('Content-type:text/html;charset = utf-8');
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,"http://3g.qq.com");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //将curl_exec()获取的信息以文件流的形式返回(不直接输出)
$h = array('HTTP_VIA:HTTP/1.1 SNXA-PS-WAP-GW21 (infoX-WISG,huawei Technologies)','HTTP_ACCEPT:application/vnd.wap.wmlscripts,text/vnd.wap.wml,application/vnd.wap.xhtml + xml,');
curl_setopt($ch,CURLOPT_HEADER,$h);
$output = culr_exec($ch);
curl_close($ch);
?>
在cURL中用POST方法发送数据
$post_data = array("foo"=>"bar","query"=>"php","action"=>"Submit");
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,1); //设置为POST
curl_setopt($ch,CURLOPT_POSTFIELDS,$post_data ); //把POST的变量加上
$output = curl_exec($ch);
curl_close($ch);
使用cURL上传文件
如果要上传一个文件,只需要把文件路径当作一个POST变量传过去,不过记得在前面加上@符号。当POST的数据来自外部时,需要注意监测并过滤@符号,因为@符号在cURL中是有特殊作用的,而本身并不属于危险字段。
$url = "http://localhost/upload_output.php";
$post_data = array("foo"=>"bar",
"upload"=>"@test.zip" //要上传的本地文件地址);
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,1); //设置为POST
curl_setopt($ch,CURLOPT_POSTFIELDS,$post_data );
$output = curl_exec($ch);
curl_close($ch);
cURL批处理(很多人把这种方式成为cURL多线程处理,而curl_multi_exec并不是多线程,它属于异步处理的范畴)
cURL有一个高级特性--批处理句柄(handle)这一特性允许同时或异步地打开过个cURL链接。实例:
//创建两个cURL资源
$ch1 = $ch2 = curl_init();
//指定URL和适当的参数
curl_setopt($ch1,CURLOPT_URL,”http://lxr.php.net“);
curl_setopt($ch1,CURLOPT_HEADER,0);
curl_setopt($ch2,CURLOPT_URL,”http://www.php.net“);
curl_setopt($ch2CURLOPT_HEADER,0);
//创建cURL批处理句柄
$mh = curl_multi_init();
//加上前面两个资源句柄
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
//预定义一个状态变量
$active = null;
//执行批处理
do{
$mrc = curl_multi_exec($mh,$active);
}while($mrc == CURLM_CALL_MULTI_PERFORM);
while($active && $mrc == CURLM_OK){
if(curl_multi_select($mh) != -1){
do{
$mrc = curl_multi_exec($mh,$active);
}while($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
//关闭各个句柄
curl_multi_remove_handle($mh,$ch1);
curl_multi_remove_handle($mh,$ch2);
curl_multi_close($mh);
这里要做的就是打开多个cURL句柄并指派给一个批处理句柄,然后只需在一个while循环里等它执行完毕。
这个实例中有两个主要循环:
第一个do...while循环重复调用curl_multi_exec()。这个函数是无隔断(non-blocking)的,但会尽可能少的执行。它返回一个状态值,只要这个值 等于常量CURLM_CALL_MULTI_PERFORM,就代表还有一些刻不容缓的工作要做。也就是说,需要不断调用该函数,直到返回值发生改变。接下来的while循环,只在$active变量为true时继续。这一变量之前作为第二个参数传给了curl_multi_exec(),代表只要批处理句柄中是否还有活动链接。接着调用curl_multi_select(),在活动链接出现之前,它都是被”屏蔽“的。这个函数成功执行后,又会进入另一个do...while循环,继续下一条URL。
}
//关闭各个句柄
curl_multi_remove_handle($mh,$ch1);
curl_multi_remove_handle($mh,$ch2);
curl_multi_close($mh);
这里要做的就是打开多个cURL句柄并指派给一个批处理句柄,然后只需在一个while循环里等它执行完毕。
这个实例中有两个主要循环:
第一个do...while循环重复调用curl_multi_exec()。这个函数是无隔断(non-blocking)的,但会尽可能少的执行。它返回一个状态值,只要这个值 等于常量CURLM_CALL_MULTI_PERFORM,就代表还有一些刻不容缓的工作要做。也就是说,需要不断调用该函数,直到返回值发生改变。接下来的while循环,只在$active变量为true时继续。这一变量之前作为第二个参数传给了curl_multi_exec(),代表只要批处理句柄中是否还有活动链接。接着调用curl_multi_select(),在活动链接出现之前,它都是被”屏蔽“的。这个函数成功执行后,又会进入另一个do...while循环,继续下一条URL。