Fork me on GitHub

PHP进阶基础知识剖析(四)之传输利器curl

让自己的内心藏着一条巨龙,既是一种苦刑,也是一种乐趣
雨果

前言

本期来讲述一下web服务中很重要的传输利器cURL,同时讲述它与PHP不得不说的秘密~~~

cURL简介

cURL是使用URL语法传输数据的命令行工具,及客户端向服务器请求的工具,可支持多种协议。可用于编写 网页爬虫、获取web services服务、下载/上传文件等

cURL用法

cURL的用法很多,在此仅仅简单的列出几种比较常用的!

  • cURL www.baidu.com //不带任何参数,用以获取此网页源码
  • cURL -o [fileName] www.baidu.com //将网页保存起来,相当于下载
  • cURL -i www.baidu.com //不仅获取网页源码还获取响应头信息
  • cURL -L www.baidu.com //使自动跳转的网页跳转到新网址
  • cURL -v www.baidu.com //显示通信整个过程包括请求头、响应头和资源
  • cURL -X GET/POST/DELETE/PUT www.baidu.com //通过加-X参数指定获取资源的方法

cURL实例:

  1. POST提交表单数据:
    curl -X POST --data “data=xxx” www.example.com
  2. 请求时添加http头:
    curl --xxx www.example.com(此xxx即为请求头)
  3. 登陆认证时:
    curl --user name:password www.example.com

PHP与cURL

讲完了cURL的基础之后,重点讲解一下PHP中的用法。其实作为PHP的扩展之一,cURL的支持还是比较完善的。

图1

相关的方法如下:


curl作为http客户端发送http请求:

curl_init初始化curl会话

curl_escape对url进行编码

curl_unescape对url进行解码

curl_setopt和curl_setopt_array分别是对curl句柄进行会话设置

curl_exec执行curl会话

curl_close关闭curl会话

curl_getinfo获取一个cURL连接资源句柄的信息

接口并发处理:

curl_multi_init 返回一个新的curl批处理句柄

curl_multi_setopt 为curl并行处理设置一个选项

curl_multi_add_handle 往curl批处理中增加一个句柄

curl_multi_remove_handle 移除一个

curl_multi_exec 运行当前批处理中每一个句柄

curl_multi_select 阻塞直到cURL批处理连接中有活动连接(轮询等待)

curl_multi_close 关闭批处理

重点是setopt方法中的option参数,常见的如下所示:

  • post方法获取资源相关:

    CURLOPT_POST: 设置使用post方法

    CURLOPT_POSTFIELDS: 设置post方法上传的资源

    CURLOPT_HTTPHEADER: 设置提交的http头
  • cookie相关:

    CURLOPT_COOKIESESSION:将开启新的一次 cookie 会话

    CURLOPT_COOKIEFILE:包含cookie数据的文件

    CURLOPT_COOKIEJAR:连接结束后,比如,调用 curl_close 后,保存 cookie 信息的文件

    CURLOPT_COOKIE:设置具体cookie
  • 文件传输相关:

    CURLOPT_URL:设置请求URL

    CURLOPT_RETURNTRANSFER:设置执行后不直接输出而是以文件流形式返回

    CURLOPT_HEADER:是否打印头部信息

    CURLOPT_FOLLOWLOCATION:是否支持页面跳转

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$data = 'username=xxxxx&password=xxx&remember=1';
$curl = curl_init();//初始化curl对象
//设置url
curl_setopt($curl, CURLOPT_URL, "http://www.imooc.com/usr/login");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//设置执行后不直接打印

date_default_timezone_set('PRC');//设置时区
curl_setopt($curl, CURLOPT_COOKIESESSION, 1);//设置cookie和session
curl_setopt($curl, CURLOPT_COOKIEFILE, "cookfile");//cookie保存的文件
curl_setopt($curl, CURLOPT_COOKIEJAR, "cookfile");//cookie读取
//cookie是什么
curl_setopt($curl, CURLOPT_COOKIE, session_name().'='.session_id());
curl_setopt($curl, CURLOPT_HEADER, 0);//不打印头部信息
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);//支持页面跳转
curl_setopt($curl, CURLOPT_POST, 1);//使用post方法
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("application/x-www-form-urlencoded;
charset=utf-8",
"Content_length:".strlen($data)
));
curl_exec($curl);
curl_close($curl);
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!
0%