PHP 支持 Daniel Stenberg 创建的 libcurl 库,能够连接通讯各种服务器、使用各种协议。libcurl 目前支持的协议有 http、https、ftp、gopher、telnet、dict、file、ldap。 libcurl 同时支持 HTTPS 证书、HTTP POST、HTTP PUT、 FTP 上传(也能通过 PHP 的 FTP 扩展完成)、HTTP 基于表单的上传、代理、cookies、用户名+密码的认证。
一、使用CURL发送请求的基本流程
使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下几个步骤:
1. 初始化连接句柄; curl_init();
2. 设置cURL选项; curl_setopt();
3. 执行并获取结果; curl_exec();
4. 释放cURL句柄。 curl_close();
二、使用cURL发送HTTP的典型过程
<?php
// 1. 初始化
$ch = curl_init();
// 2. 设置选项,包括URL
curl_setopt($ch,CURLOPT_URL,"http://www.devdo.net");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,0);
// 3. 执行并获取HTML文档内容
$output = curl_exec($ch);
if($output === FALSE ){
echo "CURL Error:".curl_error($ch);
}
// 4. 释放curl句柄
curl_close($ch);
?>
上述代码中使用到了四个函数:
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请求的输出信息
定义:curl_getinfo
— 获取一个cURL连接资源句柄的信息。获取最后一次传输的相关信息。
语法:mixed curl_getinfo ( resource $ch [, int $opt = 0 ] );
参数
ch
curl_init() 返回的 cURL
opt
参数可能是以下常量之一:
- CURLINFO_EFFECTIVE_URL - 最后一个有效的URL地址
- CURLINFO_HTTP_CODE - 最后一个收到的HTTP代码
- CURLINFO_FILETIME - 远程获取文档的时间,如果无法获取,则返回值为“-1”
- CURLINFO_TOTAL_TIME - 最后一次传输所消耗的时间
- CURLINFO_NAMELOOKUP_TIME - 名称解析所消耗的时间
- CURLINFO_CONNECT_TIME - 建立连接所消耗的时间
- CURLINFO_PRETRANSFER_TIME - 从建立连接到准备传输所使用的时间
- CURLINFO_STARTTRANSFER_TIME - 从建立连接到传输开始所使用的时间
- CURLINFO_REDIRECT_TIME - 在事务传输开始前重定向所使用的时间
- CURLINFO_SIZE_UPLOAD - 以字节为单位返回上传数据量的总值
- CURLINFO_SIZE_DOWNLOAD - 以字节为单位返回下载数据量的总值
- CURLINFO_SPEED_DOWNLOAD - 平均下载速度
- CURLINFO_SPEED_UPLOAD - 平均上传速度
- CURLINFO_HEADER_SIZE - header部分的大小
- CURLINFO_HEADER_OUT - 发送请求的字符串
- CURLINFO_REQUEST_SIZE - 在HTTP请求中有问题的请求的大小
- CURLINFO_SSL_VERIFYRESULT - 通过设置CURLOPT_SSL_VERIFYPEER返回的SSL证书验证请求的结果
- CURLINFO_CONTENT_LENGTH_DOWNLOAD - 从Content-Length: field中读取的下载内容长度
- CURLINFO_CONTENT_LENGTH_UPLOAD - 上传内容大小的说明
- CURLINFO_CONTENT_TYPE -
下载内容的Content-Type:值,NULL表示服务器没有发送有效的Content-Type: header
实例
curl_exec($ch);
$url = curl_getinfo($ch,CURLINFO_EFFECTIVE_URL);
$total_time= curl_getinfo($ch,CURLINFO_TOTAL_TIME);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo '获取 '.$url.' ,耗时'.$total_time.'秒,HTTP状态码:'.$status;
返回值:
如果 opt 被设置,以字符串形式返回它的值。否则,返回返回一个包含下列元素的关联数组(它们分别对应于 opt):
curl_exec($ch);
$info = curl_getinfo($sh);
echo ' 获取 '.$info['url'].'耗时'.$info['total_time'].'秒,HTTP状态码:'.$info['http_code'];
上述代码中curl_getinfo返回的是一个关联数组,包含以下数据:
- url:网络地址。 content_type:内容编码。
- http_code:HTTP状态码。
- header_size:header的大小。
- 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:重定向耗时。
注意:
curl_getinfo()函数还有一个可选择参数$opt
,通过这个参数可以设置一些常量,对应到上术这个字段,如果设置了第二个参数,那么返回的只有指定的信息。例如:设置$opt
为CURLINFO_TOTAL_TIME
,则curl_getinfo()
函数只返回total_time
,即总传输消耗的时间,在只需要关注某些传输信息时,设置$opt参数很有意义。
四、cURL-GET请求获取百度首页HTML文档内容
//1、初始化cURL
$ch= curl_init();
//2、设置抓取的url
curl_setopt($ch, CURLOPT_URL, 'http://www.baidu.com');
//3、设置头文件的信息作为数据流输出(false为不输出)
curl_setopt($ch, CURLOPT_HEADER, false);
//4、设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//5、执行命令
$data = curl_exec($ch);