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()
关闭会话。
一个获取百度首页的示例是这样的:
$ch = curl_init('http://www.baidu.com');
$content = curl_exec($ch);
curl_close($ch);
echo $content;
当然还有更便捷的方法,比如使用 file_get_contents()
:
$content = file_get_contents('http://www.baidu.com');
echo $content;
相比而言,cURL 更加稳定可靠,有更多的选项可以设置。file_get_contents()
虽然用起来方便,但是有可能出现获取的内容不完整的问题。
HTTP 请求都可以用 cURL 函数来实现,比如常用的 GET 和 POST 。
/**
* 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;
}
/**
* 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;
}
curl_setopt()
用来设置 cURL 传输选项。
bool curl_setopt(resource $ch, int $option, mixed $value)
/*
参数说明:
$ch - 由 curl_init() 返回的 cURL 句柄。
$option - 需要设置的 CURLOPT_XXX 选项。
$value - 将要设置在 $option 选项上的值。
*/
Guzzle 是一个 PHP 的 HTTP 客户端,用来轻而易举地发送请求,并集成到我们的 WEB 服务上。Guzzle 官网,中文文档可以参考 Guzzle 中文文档。
接口简单:构建查询语句、POST 请求、分流上传下载大文件、使用 HTTP cookies、上传 JSON 数据等等。
发送同步或异步的请求均使用相同的接口。
使用 PSR-7 接口来请求、响应、分流,允许你使用其他兼容的 PSR-7 类库与 Guzzle 共同开发。
抽象了底层的 HTTP 传输,允许你改变环境以及其他的代码,如:对 cURL 与 PHP 的流或 socket 并非重度依赖,非阻塞事件循环。
中间件系统允许你创建构成客户端行为。
使用 composer 进行安装:
composer require guzzlehttp/guzzle:~6.0
以下是使用示例:
$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();