在设计之初,cURL (Client URL Library)是一种做为使用 URL 语法传输数据的命令行工具。经过 cURL 库,咱们能够在 PHP 脚本中自由地使用某种协议来获取或者提交数据,好比获取 HTTP 请求数据。简单的来讲,cURL 是客户端向服务器请求资源的工具。php
PHP 支持 Daniel Stenberg 建立的 libcurl 库,可以链接通信各类服务器、使用各类协议。libcurl 目前支持的协议有 http、https、ftp、gopher、telnet、dict、file、ldap。 libcurl 同时支持 HTTPS 证书、HTTP POST、HTTP PUT、 FTP 上传(也能经过 PHP 的 FTP 扩展完成)、HTTP 基于表单的上传、代理、cookies、用户名+密码的认证。
在 PHP 中,想要获取某个 URL 的内容其实很简单,有多种实现方法,好比使用 file_get_contents()
函数:html
<?php $content = file_get_contents("https://segmentfault.com"); var_dump($content);
虽然 file_get_contents()
函数使用起来很方便,可是不够灵活,也无法进行错误处理。在一些复杂的请求中,不可以设置请求头、Cookie、代理、认证等相关信息,更不能向某个服务器提交表单数据,上传文件。git
cURl 库不但支持丰富的网络协议,并且提供了设置各类 URL 请求参数的方法,功能强大。cURL 的使用场景有不少,好比访问网页资源,获取 WebService 接口数据、下载 FTP 服务器文件。github
要使用 cURL 来发送 URL 请求,步骤大致分为如下四步:segmentfault
// 1. 初始化 cURL 会话 $ch = curl_init(); // 2. 设置请求选项 curl_setopt($ch, CURLOPT_URL, "https://segmentfault.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); # 获取的信息以字符串返回,而不是直接输出 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); # 禁止 cURL 验证对等证书,从而支持 HTTPS 访问 // 3. 执行 cURL 会话 $response = curl_exec($ch); var_dump($response); // 4. 关闭 cURL 会话 curl_close($ch);
cURL 主要经过
curl_setopt()
函数设置请求选项,具体的每一个选项说明请见
http://php.net/manual/zh/func...
经过 curl_error()
函数能够查看 cURL 会话错误详情,而 curl_getinfo()
函数能够查看响应信息。所以,经过这两个函数咱们能够实现一个简单的错误处理程序,好比咱们如今访问一个不存在的 URL 地址:数组
<?php // 1. 初始化 cURL 会话 $ch = curl_init(); // 2. 设置请求选项 curl_setopt($ch, CURLOPT_URL, "https://segmentfault.com/test.php"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); # 获取的信息以字符串返回,而不是直接输出 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); # 禁止 cURL 验证对等证书,从而支持 HTTPS 访问 // 3. 执行 cURL 会话 $response = curl_exec($ch); if ($response === FALSE) { echo "cURL connert error: " . curl_error($ch); exit; } $info = curl_getinfo($ch); if ($info['http_code'] == 404) { echo 'HTTP 404'; exit; } var_dump($response); // 4. 关闭 cURL 会话 curl_close($ch);
使用 cURL 模拟发送 POST 请求:服务器
<?php function curl_post($url, $data) { $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => 1, # 获取的信息以字符串返回 CURLOPT_POST => 1, # 发送 POST 请求 CURLOPT_POSTFIELDS => $data, # POST 请求数据 ]); $response = curl_exec($ch); curl_close($ch); return $response; } $url = 'http://localhost/test.php'; $data = ['id' => 1, 'username' => 'jochen']; echo curl_post($url, $data);
CURLOPT_POSTFIELDS:所有数据使用 HTTP 协议中的 "POST" 操做来发送。 要发送文件,在文件名前面加上@前缀并使用完整路径。 文件类型可在文件名后以 ';type=mimetype' 的格式指定。 这个参数能够是 urlencoded 后的字符串,相似'val1=1&val2=2&...',也可使用一个以字段名为键值,字段数据为值的数组。
经过 cURL 发送 POST 请求来实现文件上传:cookie
<?php function curl_upload($url, $data) { $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => 1, # 获取的信息以字符串返回 CURLOPT_POST => 1, # 发送 POST 请求 CURLOPT_POSTFIELDS => $data, # POST 请求数据 ]); $response = curl_exec($ch); curl_close($ch); return $response; } $url = 'http://localhost/test.php'; $data = ['id' => 1, 'file' => '@/root/image/boy.jpg']; echo curl_post($url, $data);
其实,文件下载与普通 GET 请求是同样的,只是文件下载把返回内容保存至文件中,而不是简单的输出。配合 file_put_contents()
函数实现文件下载:网络
<?php function curl_download($url, $path) { $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => 1, # 获取的信息以字符串返回 ]); $response = curl_exec($ch); curl_close($ch); return file_put_contents($path, $response); } curl_download('http://localhost/boy.jpg', './boy.jpg');
若是服务器端须要验证请求,设置 CURLOPT_USERPWD
参数便可:app
<?php function curl_auth($url, $user, $passwd) { $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $url, CURLOPT_USERPWD => "$user:$passwd", # 格式为:"[username]:[password]" CURLOPT_RETURNTRANSFER => 1 ]); $result = curl_exec($ch); curl_close($ch); return $result; } echo curl_auth('http://localhost', 'jochen', 'password');
这里主要展现模拟登陆使用了 Cookie 来保持登陆状态的应用。首先咱们须要经过帐号密码登陆获取到 Cookie 数据,而后利用已登陆的 Cookie 获取页面数据:
<?php // 模拟登陆获取 Cookie function curl_login($url, $data, $cookie) { $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $url, CURLOPT_POST => 1, # 发送 POST 请求 CURLOPT_POSTFIELDS => $data, # POST 请求数据 CURLOPT_COOKIEJAR => $cookie # 将 cookie 信息保存至文件中 CURLOPT_RETURNTRANSFER => 1, # 获取的信息以字符串返回 ]); $response = curl_exec($ch); curl_close($ch); return $response; } // 获取页面数据 function curl_content($url, $cookie) { $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $url, CURLOPT_COOKIEFILE => $cookie # 加载包含 Cookie 数据的文件 CURLOPT_RETURNTRANSFER => 1, # 获取的信息以字符串返回 ]); $response = curl_exec($ch); curl_close($ch); return $response; } $post = ['username' => 'jochen', 'password' => '123456']; $cookie = './cookie.txt'; if (curl_login('http://localhost/login', $post, $cookie)) { echo curl_content('http://localhost', $cookie); }
PHP Curl Class 是一个编写得很好的 cURL 封装库,它能够很是方便地发送 HTTP 请求并与任何类型的 Web API 集成。PHP Curl Class 封装库适用于 PHP 5.3,5.4,5.5,5.6,7.0,7.1 和 HHVM。这个库是众所周知的,并提供了一个很是简单的语法:
<?php require __DIR__ . '/vendor/autoload.php'; use \Curl\Curl; $curl = new Curl(); $curl->get('https://www.example.com/'); if ($curl->error) { echo 'Error: ' . $curl->errorCode . ': ' . $curl->errorMessage . "\n"; } else { echo 'Response:' . "\n"; var_dump($curl->response); }
参考文章: