PHP+cURL扩展的使用

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请求。上述代码片段中使用了三个重要的选项:

  1. CURLOPT_URL 指定请求的URL;
  2. CURLOPT_RETURNTRANSFER 设置为1表示稍后执行的curl_exec函数的返回是URL的返回字符串,而不是把返回字符串定向到标准输出并返回TRUE;
  3. CURLLOPT_HEADER设置为0表示不返回HTTP头部信息。
  4. 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返回的是一个关联数组,包含以下数据:

  1. url:网络地址。 content_type:内容编码。
  2. http_code:HTTP状态码。
  3. header_size:header的大小。
  4. filetime:文件创建的时间。
  5. ssl_verify_result:SSL验证结果。
  6. redirect_count:跳转计数。
  7. total_time:总耗时。
  8. namelookup_time:DNS查询耗时。
  9. connect_time:等待连接耗时。
  10. pretransfer_time:传输前准备耗时。
  11. size_uplpad:上传数据的大小。
  12. size_download:下载数据的大小。
  13. speed_download:下载速度。
  14. speed_upload:上传速度。
  15. download_content_length:下载内容的长度。
  16. upload_content_length:上传内容的长度。
  17. starttransfer_time:开始传输的时间表。
  18. redirect_time:重定向耗时。

注意
  curl_getinfo()函数还有一个可选择参数$opt ,通过这个参数可以设置一些常量,对应到上术这个字段,如果设置了第二个参数,那么返回的只有指定的信息。例如:设置$optCURLINFO_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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值