PHP cURL 扩展库

老牛浏览 367评论 0发表于

1. 介绍

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_init() 初始化 cURL 会话,接着可以通过 curl_setopt() 设置需要的全部选项,然后使用 curl_exec() 来执行会话,当执行完会话后使用 curl_close() 关闭会话。

一个获取百度首页的示例是这样的:

php
$ch = curl_init('http://www.baidu.com');
$content = curl_exec($ch);
curl_close($ch);
echo $content;

当然还有更便捷的方法,比如使用 file_get_contents()

php
$content = file_get_contents('http://www.baidu.com');
echo $content;

相比而言,cURL 更加稳定可靠,有更多的选项可以设置。file_get_contents() 虽然用起来方便,但是有可能出现获取的内容不完整的问题。

2. cURL 请求封装

HTTP 请求都可以用 cURL 函数来实现,比如常用的 GET 和 POST 。

2.1 GET 请求封装

php
/**
 * GET 请求简易封装
 *
 * @param $url
 * @return mixed
 */
function get($url)
{
    //初始化
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);

    //执行后不直接打印出来
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);

    //跳过证书检查
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    //不从证书中检查 SSL 加密算法是否存在
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    //执行并获取内容
    $output = curl_exec($ch);

    //释放句柄
    curl_close($ch);

    return $output;
}

2.2 POST 请求封装

php
/**
 * POST 请求简易封装
 *
 * @param $url
 * @param $data
 * @param $header
 * @return mixed
 */
function post($url, $data, $header)
{
    //初始化
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);

    //执行后不直接打印出来
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    //设置请求方式为 post
    curl_setopt($ch, CURLOPT_POST, true);

    //添加请求参数
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    //添加请求头,可以传数组
    curl_setopt($ch, CURLOPT_HEADER, $header);

    //跳过证书检查
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    //不从证书中检查 SSL 加密算法是否存在
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    //执行并获取内容
    $output = curl_exec($ch);

    //释放句柄
    curl_close($ch);

    return $output;
}

3. curl_setopt() 选项详解

curl_setopt() 用来设置 cURL 传输选项。

php
bool curl_setopt(resource $ch, int $option, mixed $value)
/*
参数说明:
$ch - 由 curl_init() 返回的 cURL 句柄。
$option - 需要设置的 CURLOPT_XXX 选项。
$value - 将要设置在 $option 选项上的值。
*/

4. GuzzleHttp 类

Guzzle 是一个 PHP 的 HTTP 客户端,用来轻而易举地发送请求,并集成到我们的 WEB 服务上。Guzzle 官网,中文文档可以参考 Guzzle 中文文档

4.1 主要特点

  • 接口简单:构建查询语句、POST 请求、分流上传下载大文件、使用 HTTP cookies、上传 JSON 数据等等。

  • 发送同步或异步的请求均使用相同的接口。

  • 使用 PSR-7 接口来请求、响应、分流,允许你使用其他兼容的 PSR-7 类库与 Guzzle 共同开发。

  • 抽象了底层的 HTTP 传输,允许你改变环境以及其他的代码,如:对 cURL 与 PHP 的流或 socket 并非重度依赖,非阻塞事件循环。

  • 中间件系统允许你创建构成客户端行为。

4.2 安装使用

使用 composer 进行安装:

bash
composer require guzzlehttp/guzzle:~6.0

以下是使用示例:

php
$client = new GuzzleHttp\Client();
$res = $client->request('GET', 'https://api.github.com/user', [
    'auth' => ['user', 'pass']
]);
echo $res->getStatusCode();
// "200"
echo $res->getHeader('content-type');
// 'application/json; charset=utf8'
echo $res->getBody();
// {"type":"User"...'

// 发送一个异步请求
$request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org');
$promise = $client->sendAsync($request)->then(function ($response) {
    echo 'I completed! ' . $response->getBody();
});
$promise->wait();
点赞
收藏
暂无评论,快来发表评论吧~
私信
老牛@ilaoniu
老牛,俗称哞哞。单纯的九零后理工小青年。喜欢折腾,爱玩,爱音乐,爱游戏,爱电影,爱旅游...
最后活跃于