curl是PHP中很强大的一个扩展库,应用的场景非常多。它的作用是可以让PHP模拟出一个“浏览器”传输数据。
现在的网络是开放式的、数据共享时代,有很多功能不是什么都需要自己去开发。比如网站显示手机号的归属地,不可能我们自己去搞一个庞大的数据库吧,存着上亿的手机号归属地信息。我们可以利用第三方提供的接口轻松完成这样的功能。接口怎么用?原理和我们访问一个网站是一样的,都是http协议。此时我们的网站就是一个“客户端”,接口就是需要访问的“网站”,通过curl的一系列函数我们的网站程序就可以模拟出“类似浏览器访问”的过程。
现在的网站平台大多都在使用着第三方的接口完成一些功能,类似于QQ登录也是。所以curl显得尤为重要,大家需要多去研究学习的。curl扩展默认是不开启的,用之前需要PHPinfo()查看下有没有开启。
使用cURL完成简单的请求主要分为以下四步:
1.初始化,创建一个新cURL资源
2.设置URL和相应的选项
3.抓取URL并把它传递给浏览器
4.关闭cURL资源,并且释放系统资源
curl_init — 初始化一个cURL会话
先创建一个curl的资源
curl_setopt — 设置一个cURL传输选项
这个函数的参数值自己去手册里看吧,多得眼花缭乱。它可以设置各种属性,待会举例子只列几个常用的。
curl_exec — 执行一个cURL会话
curl_close — 关闭一个cURL会话
先看一个简单的示例:
PHP利用curl访问了百度,由于第8行代码第三个参数设置为FALSE,curl_exec($curl)直接把结果显示在页面里。如果我把那个参数设置为TRUE,curl_exec($curl)不会直接打印结果在页面,而是以字符的形式返回。
再介绍几个选项参数:
curl是PHP非常重要的一个扩展,应用非常多。从PHP手册里也可以看到curl_setopt函数的参数非常多,足够我们研究一阵子了。
curl的作用就是模拟浏览器发送访问请求。有时候会有这样的需求,程序只是去请求网址,并不关心返回的结果是什么,这样的情况我们可以设置超时时间的。比如请求一个页面需要好几秒,curl最短可以设置1秒(下面是设置超时时间的代码):
curl_setopt($curl, CURLOPT_FRESH_CONNECT, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 1);
curl_exec函数等待超过1秒就中断连接,不接收返回结果,直接往下执行代码,这样的好处可以减少程序运行的时间。
一个重要的知识点:
那服务端(被请求方)会不会立马中断?一般是不会的。服务端如果不给客户端(请求端)返回信息,它是不知道客户端已经断开连接的,所以会继续执行客户端的请求。
分享一段代码可测试下:
脚本会暂停5秒再执行第4行代码。
打开页面立马关闭(5秒内),然后就会看到测试结果:
虽然浏览器很快关闭了页面,但5秒后还是生成了文件1.txt
测试结果:服务端在不知道TCP连接已断的情况下,会继续执行脚本代码。
参数“CURLOPT_TIMEOUT”是成功连接后超时时间。
参数“CURLOPT_CONNECTTIMEOUT”是成功连接服务器前最长等待时间。
curl就说这些吧,先记住curl的作用——可以用来模拟浏览器,以后有需求时再去仔细查看curl怎么用。
额外补充:
楠神在介绍预定义变量$_SERVER时说过“所有‘HTTP_’开头的下标参数都是不可信的,这些参数都是浏览器提交过来的”,curl可以伪造这些参数向服务器提交。
比如$_SERVER['HTTP_REFERER']可以通过curl_setopt的这个参数伪造:
客户端IP地址$_SERVER['REMOTE_ADDR']不是从浏览器提交过来的,它是从网络层(TCP/IP)获取到的,它是TCP连接的源IP,不能通过更改HTTP标头来替代。比较可信,不能伪造。假如有人使用了代理IP(代理服务器)访问网站,那获取到的IP值是代理IP,不是用户自己的客户机IP。
所以说$_SERVER['REMOTE_ADDR']不能随意伪造成某一IP,但也不一定能真实获取到用户的IP。
URL函数:
与curl一块使用最多的就是URL函数了,有时候第三方接口接收的字符串数据需要做一些处理,比如base64转码,这就用到函数base64_encode和base64_decode了。
URL函数不多,大家去手册里了解下吧,实际开发中涉及到与第三方交互时会应用到的。
拓展《PHP的curl扩展返回空字符串的问题分析(返回302 found)》