前言
PHP 提供了大量的扩展以供使用,这使许多底层功能,甚至是与其他程序交互的接口,都得到了封装,开发者可以很方便的直接使用。
curl就是其中之一。
有了curl扩展,我们只需要使用少数几个函数就可以完成一次网络通信,我们不需要去TCP上开一条通道出来,甚至去监听通信状态。
一张图,说说PHP的CURL
PHP CURL.png
可能刚入门的时候,各种各样的文章,教程,会让人有些乱。但不要慌,其实总结下来,也就那么回事。只是设置不同的参数,来达到不同的效果而已。
理一张图,让给脑子清晰一点。
我想,应该没有人能够把函数记得十分清晰,所以,还是得看看手册。
PHP官方CURL参考手册
说好的从0到1
<?php
// +----------------------------------------------------------------------
// | OCMS v1.1 http://blog.vsonweb.com
// +----------------------------------------------------------------------
// | Copyright (c) 2016 VSONWEB All rights reserved.
// +----------------------------------------------------------------------
// | File: Curl.class.php Curl工具类
// +----------------------------------------------------------------------
// | Author: Object <2252390865@qq.com>
// +----------------------------------------------------------------------
// | Date: 2016年11月10日
// +----------------------------------------------------------------------
class Curltool{
public $header; // 请求头
public function __construct($header = array()){
if (empty($header)) {
$this->header[] = "Accept : text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01";
// $this->header[] = "Accept-Encoding : gzip, deflate, br";
$this->header[] = "Accept-Language : zh,zh-CN;q=0.8,en-US;q=0.5,en;q=0.3";
$this->header[] = "Referer : http://blog.vsonweb.com";
$this->header[] = "User-Agent : Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0";
// $this->header[] = "content-type: application/x-www-form-urlencoded; charset=UTF-8";
}
}
/**
* 发送GET请求
* @author Object
* @date 2016-11-10
* @param string $url 请求地址
* @return mixed
*
* 使用案例 :
*
* include_once 'Curl.class.php';
* $curl = new Curltool();
* $c = $curl->sendGet('https://blog.vsonweb.com');
* $c['content'] = htmlspecialchars($c['content']); // 转义输出
* p($c);
*
*/
public function sendGet($url){
$ch = curl_init(); // 创建一个curl句柄
curl_setopt($ch,CURLOPT_HTTPHEADER,$this->header); // 设置请求头
if (preg_match("#^https://#i",$url) == 1) {
# https时,不严格认证
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); // 不自动验证证书,则信任任何证书
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2); // 检查证书中是否设置域名, 该值不能填true和1,要用2来代替。
# https时,严格校验证书
/*
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 只信任CA颁布的证书
curl_setopt($ch, CURLOPT_CAINFO, $cacert); // CA根证书(用来验证的网站证书是否是CA颁布)
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 检查证书中是否设置域名,并且是否与提供的主机名匹配
*/
}
curl_setopt($ch,CURLOPT_URL,$url); // 设置请求地址
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置 curl_exec 时,以字符串接收返回的信息,不直接输出
$data['content'] = curl_exec($ch); // 执行请求
$data['getinfo'] = curl_getinfo($ch); // 获取请求状态
curl_close($ch); // 释放请求资源
if ($data['getinfo']['http_code'] == 200) {
return $data; // 注意:此处返回数据的格式,可能是json,也可能是文本接收处可另行转换
}else{
return false;
}
}
/**
* 发送POST请求
* @author Object
* @date 2016-11-11
* @param string $url 请求地址
* @param array $params post参数
* @return mixed
*/
public function sendPost($url,$params = array()){
$ch = curl_init();
if (preg_match("#^https://#i",$url) == 1) {
# https时,不严格认证
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); // 不自动验证证书,则信任任何证书
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2); // 检查证书中是否设置域名, 该值不能填true和1,要用2来代替。
# https时,严格校验证书
/*
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 只信任CA颁布的证书
curl_setopt($ch, CURLOPT_CAINFO, $cacert); // CA根证书(用来验证的网站证书是否是CA颁布)
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 检查证书中是否设置域名,并且是否与提供的主机名匹配
*/
}
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 字符串形式返回
curl_setopt($ch, CURLOPT_POST, true); // 设置为post请求
curl_setopt($ch,CURLOPT_POSTFIELDS,$params); // 设置post附带参数
$data['content'] = curl_exec($ch); // 执行请求
$data['getinfo'] = curl_getinfo($ch); // 获取请求状态
curl_close($ch); // 释放请求资源
if ($data['getinfo']['http_code'] == 200) {
return $data; // 注意:此处返回数据的格式,可能是json,也可能是文本接收处可另行转换
}else{
return false;
}
}
}
?>
注释比代码还多……因为这是对自己最好的学习方式。
结语
curl在开发项目中的应用,咱不多说了,总之很常见,特别是在这个互联网共享经济时代,以供调用的接口数不胜数。
上述的代码,只是一个比较简单的案例,以供入门。
网友评论