CURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。PHP也支持 CURL 库。
使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下几个步骤:
1.初始化连接句柄;
2.设置CURL选项;
3.执行并获取结果;
4.释放CURL连接句柄。
使用CURL发送HTTP的典型过程
<?php $url = 'https://www.9xue.cn/web/admin.php'; //1.初始化 $ch = curl_init(); //2.设置选项,包括URL curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); //3.执行并获取内容 $output = curl_exec($ch); //4.释放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()获取的信息以文件流的形式返回,而不是直接输出。例如,我们只想把获取到的内容输入到文件,而不是直接输出给浏览器,我们就可以使用CURLOPT_RETURNTRANSFER选项
CURLLOPT_HEADER :设置为0表示不返回HTTP头部信息。
CURL 发送POST请求的实例:
<?php $url = 'https://www.9xue.cn/web/admin.php'; $post_data = array ("username" => "haha","key" => "123456"); //1.初始化 $ch = curl_init(); //2.设置选项 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); //3.执行并获取内容 $output = curl_exec($ch); //4.释放curl句柄 curl_close($ch); //打印获得的数据 $tmpArray = json_decode($output, true); print_r(tmpArray);
以上方式获取到的数据是json格式的,使用json_decode函数解释成数组。
获取CURL请求的输出信息
在curl_exec()函数执行之后,可以使用curl_getinfo()函数获取CURL请求输出的相关信息,
示例代码如下:
<?php ... curl_exec($ch); $info = curl_getinfo($ch); echo ' 获取 '.$info['url'].'耗时'.$info['total_time'].'秒';
上述代码中curl_getinfo返回的是一个关联数组,包含以下数据:
url: 网络地址。
content_type: 内容编码。
http_code: HTTP状态码。
header_size: header的大小。
request_size: 请求的大小。
filetime: 文件创建的时间。
ssl_verify_result: SSL验证结果。
redirect_count: 跳转计数。
total_time: 总耗时。
namelookup_time: DNS查询耗时。
connect_time: 等待连接耗时。
pretransfer_time: 传输前准备耗时。
size_uplpad: 上传数据的大小。
size_download: 下载数据的大小。
speed_download: 下载速度。
speed_upload: 上传速度。
download_content_length: 下载内容的长度。
upload_content_length: 上传内容的长度。
starttransfer_time: 开始传输的时间表。
redirect_time: 重定向耗时。