技术饭
PHP数据传输神器CURL详解
前言
我们在使用PHP开发网站的后台的时候,有时候需要在PHP代码中请求某一个网页,比如在微信开发中,我们在代码中请求微信服务器地址,得到开发凭证access_token,这时候使用CURL来处理请求是最合适的。如果你想使用PHP来开发微信,那么CURL是一个必备的知识点。
CURL的使用
CURL基础
在PHP中我们想要使用CURL,必须在PHP的配置文件中开启CURL扩展。
curl支持的协议还是有很多的,目前支持HTTP、HTTPS、FTP、Telnet、DICT、FILE,同时也支持HTTPS的认证,HTTP POST、HTTP PUT、FTP等的上传。HTTP基于表单的上传、代理、cookie的认证。
CURL的使用步骤
curl的使用一般分为四步:
curl_init() 初始化一个curl对话
curl_setopt()设置curl传输选项。
curl_exec()执行一个curl会话
curl_close()关闭一个curl会话。
我们使用curl功能大致就分为这四步,而我们设置参数是通过curl_setopt()这个函数来实现的。我们关心的也就是curl_setopt里面的参数。
curl最简单的应用
使用CURL来简单的访问网页,得到数据。
$url = 'http://blog.csdn.net/li741350149/article/details/53692393';
$res = curl_init();
curl_setopt($res,CURLOPT_URL,$url);
curl_exec($res);
curl_close($res);
12345
上面的代码也就是开始所说的分为四步。我们运行下面的代码,会看到直接在浏览器上显示出来了,但是我们并没有进行任何输出,这是因为,CURL默认会把网页返回的结果展示在浏览器上。
当然,我们可以进行设置,让返回结果保存在变量中。这时就要用到我们说过的通过curl_setopt()进行设置。
$url = 'http://blog.csdn.net/li741350149/article/category/6425553';
$res = curl_init();
curl_setopt($res,CURLOPT_URL,\$url);
//true表示以文件流的方式输出到变量里面,false是把内容直接进行展示;
curl_setopt(\$res,CURLOPT_RETURNTRANSFER,true);
$result = curl_exec($res);
curl_close(\$res);
var_dump($result);
12345678
这样我们就把数据保存到变量中,方便我们后续的操作。
curl_setopt()参数列表
其实我们使用CURL,主要都是通过curl_setopt()进行设置的,下面的列表就是curl_setopt()里面参数的各种说明。
选项 | 作用 | 类型 | 应用场景 |
CURLOPT_URL | 需要获取的URL地址 | String | 接口地址 |
CURLOPT_RETURNTRANSFER | 将curl_exec()获取的信息以文件流的形式返回,而不是直接输出 | Bool | 需要解析返回文件 |
CURLOPT_POST | 设置请求为POST请求 | Bool | 模拟POST请求 |
CURLOPT_POSTFIELDS | POST请求时的表单信息,如果上传文件,在前面加一个@符号 | Array | 设置POST数据 |
CURLOPT_REFERER | 在HTTP请求头中“Referer”的内容 | String | 模拟请求来源 |
CURLOPT_HEADER | 启用时会将头文件的信息作为数据流输出 | Bool | 代码调试 |
CURLOPT_SSL_VERIFYHOST | 1.检查服务器SSL证书中是否存在一个公用名,2.检查公用名是否存在,并且是否与提供主机名匹配 | Integer | 非SAE,BAE模拟HTTPS时需打开 |
CURLOPT_SSL_VERIFYPEER | 验证HTTPS证书是否有效,设置为False,不再进行证书验证 | Bool | 非SAE,BAE模拟HTTPS时需打开 |
CURLOPT_USERAGENT | 模拟浏览器信息 | String | 模拟浏览器访问 |
上面的参数都是我们常用到。
curl模拟GET请求
curl进行get请求
$url = 'http://blog.csdn.net/li741350149/article/category/6425553';
$curl = curl_init();
//需要请求的是哪个地址
curl_setopt($curl,CURLOPT_URL,$url);
//表示把请求的数据已文件流的方式输出到变量中
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
$result = curl_exec($curl);
curl_close($curl);
return $result;
123456789
可以看到get请求的代码和上面的一样,我们可以通过url地址进行参数的传递
curl模拟POST请求
post请求和get请求大致一样,不过post和get的提交数据方式不一样。只需要设置两个参数就可以了。
$url = 'http://blog.csdn.net/li741350149/article/category/6425553';
$curl = curl_init();
//需要请求的是哪个地址
curl_setopt($curl,CURLOPT_URL,$url);
//表示把请求的数据已文件流的方式输出到变量中
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
//设置请求方式是post方式
curl_setopt($curl,CURLOPT_POST,1);
//设置post请求提交的表单信息
curl_setopt($curl,CURLOPT_POSTFIELDS,$data);
$result = curl_exec($curl);
curl_close($curl);
return $result;12345678910111213
可以看到post请求只是设置请求方式为post,并且把数据传递过去。
curl模拟发送HTTPS请求
进行微信开发的人都知道,微信的接口使用的都是HTTPS进行传输的,并且通常都是在微信服务器和个人服务器上进行数据的传递,这中间正式依靠了curl进行实现的。curl是可以进行模拟HTTPS进行传输的。下面的就是使用curl把HTTPS协议的get请求和post请求封装到一起。
//https请求(支持GET和POST)
function http_request($url,$data = null){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
//设置请求的代理信息
$user_agent = isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT'] : "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
curl_setopt($curl,CURLOPT_USERAGENT,$user_agent);
//设置请求来源信息
curl_setopt($curl,CURLOPT_AUTOREFERER,TRUE);
//设置和ssl相关的信息
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if(!empty($data)){
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
//var_dump(curl_error($curl));
curl_close($curl);
return $output;
}
12345678910111213141516171819202122232425
其实就是设置了两个和SSL相关的参数。参数的解释都在表格中进行解释过。
总结
我们在使用CURL的时候,我们可以把我们常用到的一些方法,像get请求post请求等,封装起来,这样在使用时直接调用方法进行了,不用每次都要写一遍。
参考资料:
文明上网理性发言!