curl函数的强大之处就可以像用户一样的去访问一个网页并且可以是php所能接受的所有数据提交模式了,下面我们来看一个php中curl实现get和post请求抓取网页或上传文件的例子并且它还支持跨项目和跨服务器的哦。
一:curl 函数和参数详解
函数库:
1:curl_init 初始化一个curl会话
2:curl_close 关闭一个curl会话
3:curl_setopt 为一个curl设置会话参数
4:curl_error 返回一个包含当前会话错误信息的字符串
5:curl_exec 执行一个curl会话
6:curl_multi_add_handle 向curl批处理会话中添加单独的curl句柄资源
7:curl_multi_close 关闭一个批处理句柄资源
8:curl_multi_exec 解析一个curl批处理句柄
9:curl_multi_getcontent 返回获取的输出的文本流
10:curl_multi_info_read 获取当前解析的curl的相关传输信息
11:curl_multi_init 初始化一个curl批处理句柄资源
12:curl_multi_remove_handle 移除curl批处理句柄资源中的某个句柄资源
13:curl_multi_select 阻塞直到curl批处理连接中有活动连接
14:curl_setopt_array 以数组的形式为一个curl设置会话参数
15:curl_version 获取curl相关的版本信息
16:curl_getinfo 获取一个curl连接资源句柄的信息
17:curl_copy_handle 拷贝一个curl连接资源的所有内容和参数
18:curl_errno 返回一个包含当前会话错误信息的数字编号
curl_setopt常用可设置参数:
curlopt_url 请求的url地址
curlopt_returntransfer 设置是否获取数据返回,数据以文件流的形式返回,不是直接输出
curlopt_post 设置是否post请求,类型为:application/x-www-form-urlencoded,跟表单提交一样
curlopt_postfields post请求的数据
curlopt_header 启用时会将头文件的信息作为数据流输出
curlopt_httpget 启用时会设置http的method为get,默认是get
二:curl get 方式
ceshi,pwd => sada&1dsw1,key=>ha);$ch = curl_init();//初始化curlcurl_setopt($ch, curlopt_url, $url);//设置请求地址curl_setopt($ch, curlopt_returntransfer, 1);//返回值curl_setopt($ch, curlopt_post, 1);//设置请求方式postcurl_setopt($ch, curlopt_postfields, $post_data);//请求所带变量数据$output = curl_exec($ch);//执行获取返回数据,返回的数据建议json_encode($return_data);curl_close($ch);$output =json_decode($output );//解析返回数据
四:curl post 方式上传文件
$post_data=array(filedata=>@.$image_file);//利用数组传值,image_file为图片地址,@不能少,标明是一个文件$url = http://localhost/ceshi.php;$ch = curl_init(); //初始化curlcurl_setopt($ch, curlopt_url, $url);//设置链接curl_setopt($ch, curlopt_returntransfer, true);//设置是否返回信息curl_setopt($ch, curlopt_post, true);//设置为post方式curl_setopt($ch, curlopt_postfields, $post_data);//post数据$result = curl_exec($ch);//接收返回信息if(curl_errno($ch)){//出错则显示错误信息die(json_encode($ch));}curl_close($ch); //关闭curl链接if (ord($result[0])==239 && ord($result[1])==187&&ord($result[2])== 191){$result = substr( $result,3);//解决bom头带来的json_decode为空的bug,bom头是固定的,可以检测后去除掉}$result=json_decode($result);?>
五:curl post 文件上传常见问题和解决办法:
1:curl_setopt设置curlopt_postfields 传值是个数组,后端一直无法获取数据$_post的值
错误现象:
如果$post_data是数组(包括多维数组)的话会出现entity is too large的错误提示,接收数据的receive.php 无法获取curl传过来的数据
原因:
curl post方法时候,传递一个数组到curlopt_postfields,curl会把数据编码成 multipart/form-data,如果传递一个url-encoded字符串时,数据会被编码成 application/x-www-form-urlencoded,对于multipart/form-data的编码方式其实相当于我们直接以enctype=multipart/form-data method=post 这样的表单进行操作
解决办法:
a:
对$post_data 数组经 urlencode() 编码后进行字符串连接,
例:$post_data=&name=urlencode($name)&pwd=usrlencode($pwd)
b:
直接利用http_build_query()进行参数的拼接。
ps:
multipart/form-data 是把表单设置为mime编码,目的是用来传输二进制文件的,若想上传文件,必须用这个编码(例子见上面的curl post上传文件的例子);但是普通的url数据使用的是application/x-www-form-urlencoded 格式。
2:curl请求返回数据头部多了三个字节,post请求后端是以json_encode 数据格式返回,进行json_decode后返回值始终为空
原因:bom头搞的鬼,bom头:在windows下用记事本之类的程序将文本文件保存为utf-8格式时,记事本会在文件头前面加上几个不可见的字符(ef bb bf),就是所谓的bom(byte order mark),就是这前面多了三个字节导致json_decode后返回值为空
对返回值进行bom头检测检测:
echo substr( $result, 0, 1 ); //看到一个乱码echo substr( $result, 0, 2 ); //看到两个乱码echo substr( $result, 0, 3 ); //空白echo substr( $result, 0, 4 ); //看到o
证明确实是bom头的问题
解决办法:
if ( ord( $result[0] ) == 239 && ord( $result[1] ) == 187&& ord( $result[2] ) == 191 ) { $result = substr( $result, 3 );//bom头是固定的,可以检测后去除掉}
教程链接:
随意转载~但请保留教程地址★