cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等,我们使用它来发送HTTP请求。它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。本文将介绍cURL的一些特性,以及在PHP中如何运用它使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下四个步骤:1.初始化连接句柄curl_init();2.设置CURL选项curl_setopt() ;3.执行并获取结果curl_exec();4.释放VURL连接句柄curl_close()。cURL实现GET//初始化
$ch = curl_init();
//设置选项,包括URL
curl_setopt($ch, CURLOPT_URL, "http://4dn.net");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
//执行并获取HTML文档内容
$output = curl_exec($ch);
//释放curl句柄
curl_close($ch);
//打印获得的数据
print_r($output);上述代码中使用到了四个函数curl_init() 和 curl_close() 分别是初始化CURL连接和关闭CURL连接,都比较简单curl_exec() 执行CURL请求,如果没有错误发生,该函数的返回是对应URL返回的数据,以字符串表示满意;如果发生错误,该函数返回 FALSE需要注意的是,判断输出是否为FALSE用的是全等号,这是为了区分返回空串和出错的情况CURL函数库里最重要的函数是curl_setopt(),它可以通过设定CURL函数库定义的选项来定制HTTP请求上述代码片段中使用了三个重要的选项:CURLOPT_URL 指定请求的URL;CURLOPT_RETURNTRANSFER 设置为1表示稍后执行的curl_exec函数的返回是URL的返回字符串,而不是把返回字符串定向到标准输出并返回TRUE;CURLLOPT_HEADER设置为0表示不返回HTTP头部信息CURL的选项还有很多,可以到PHP的官方网站(http://www.php.net/manual/en/function.curl-setopt.php)上查看CURL支持的所有选项列表cURL实现POST$url = "http://localhost/server.php";
$post_data = array ("username" => "bob","key" => "12345");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// post数据
curl_setopt($ch, CURLOPT_POST, 1);
// post的变量
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
//打印获得的数据
print_r($output);PHP实现的封装<?php
class Curl
{
/**
* @brief get请求
* @param $url 请求的url
* @param array $param 请求的参数
* @param int $timeout 超时时间
* @param int $log 是否启用日志
* @return mixed
*/
public static function get($url, $param=array(), $timeout=10, $log=1)
{
$ch = curl_init();
if (is_array($param)) {
$url = $url . '?' . http_build_query($param);
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); // 允许 cURL 函数执行的最长秒数
$data = curl_exec($ch);
if ($log) {
$data .= "rn";
$data .= self::logInfo($ch, $param, $data);
}
curl_close($ch);
return $data;
}
/**
* @brief post请求
* @param $url 请求的url地址
* @param array $param 请求的参数
* @param int $log 是否启用日志
* @return mixed
*/
public static function post($url, $param=array(), $header=array(), $timeout=10, $log=1)
{
$ch = curl_init();
if (is_array($param)) {
$urlparam = http_build_query($param);
} else if (is_string($param)) { //json字符串
$urlparam = $param;
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); //设置超时时间
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回原生的(Raw)输出
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_POST, 1); //POST
curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); //post数据
if ($header) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
}
$data = curl_exec($ch);
if ($log) {
$data .= "rn";
$data .= self::logInfo($ch, $param, $data);
}
curl_close($ch);
return $data;
}
/**
* 请求信息记录日志
* @param $ch curl句柄
* @param $request 请求参数
* @param $response 响应结果
*/
private static function logInfo($ch, $request, $response)
{
$info = curl_getinfo($ch);
$resultFormat = "耗时:[%s] 返回状态:[%s] 请求的url[%s] 请求参数:[%s] 响应结果:[%s] 大小:[%s]kb 速度:[%s]kb/s";
$resultLogMsg = sprintf($resultFormat, $info['total_time'], $info['http_code'], $info['url'], var_export($request,true),var_export($response,true), $info['size_download']/1024, $info['speed_download']/1024);
return $resultLogMsg;
}
}用法:// get请求
echo Curl::get('http://www.baidu.com');
// post请求
$arr = Curl::post('http://localhost:9090/test.php', ['a'=>1,'b'=>2]);
print_r($arr);
评论
171条评论A阿诺. Lv.1 Chrome 86.0.4240.198 Windows 7 x64 Edition 回复
你把福娃乏味
河北省沧州市 联通
山海 Lv.1 回复
哈哈哈,感谢
中国 移动
a以苏H.星漫阁 Lv.1 回复
很好
四川省广安市 广电网
1111111 Lv.1 Chrome 70.0.3538.25 Windows 7 x64 Edition 回复
爱是飒飒飒飒
广西南宁市 电信
清风与烈酒 Lv.1 Safari 14.0.3 Mac OS X 10.15.6 回复
很香看看,需要这个
湖南省衡阳市 电信
九九网络 Lv.1 Chrome 83. Android 10 回复
试试
中国 移动
÷ Lv.1 Chrome 70.0.3538.102 Windows 回复
看起来好像不错的样子
北京市 联通
撒旦 Lv.1 Chrome 75.0.3770.100 Windows 回复
可可以
四川省成都市 电信
pony Lv.2 Chrome 88.0.4324.182 Windows 回复
牛逼牛逼
中国 移动
小久云 Lv.1 Android Webkit 4.0 Android 10 回复
顶
辽宁省沈阳市 联通