资讯专栏INFORMATION COLUMN

PHP 中的 cURL 库

happen / 267人阅读

摘要:支持创建的库,能够连接通讯各种服务器使用各种协议。目前支持的协议有。在一些复杂的请求中,不能够设置请求头代理认证等相关信息,更不能向某个服务器提交表单数据,上传文件。文件类型可在文件名后以的格式指定。

概述 简介

在设计之初,cURL (Client URL Library)是一种作为使用 URL 语法传输数据的命令行工具。通过 cURL 库,我们可以在 PHP 脚本中自由地使用某种协议来获取或者提交数据,比如获取 HTTP 请求数据。简单的来说,cURL 是客户端向服务器请求资源的工具。

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() 函数:


虽然 file_get_contents() 函数使用起来很方便,但是不够灵活,也没法进行错误处理。在一些复杂的请求中,不能够设置请求头、Cookie、代理、认证等相关信息,更不能向某个服务器提交表单数据,上传文件。

cURl 库不但支持丰富的网络协议,而且提供了设置各种 URL 请求参数的方法,功能强大。cURL 的使用场景有很多,比如访问网页资源,获取 WebService 接口数据、下载 FTP 服务器文件。

使用 基本步骤

要使用 cURL 来发送 URL 请求,步骤大体分为以下四步:

初始化 cURL 会话;

设置请求选项;

执行 cURL 会话;

关闭 cURL 会话。

// 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 地址:


实战案例
1. POST 请求

使用 cURL 模拟发送 POST 请求:

 $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);
2. 文件上传
CURLOPT_POSTFIELDS:全部数据使用 HTTP 协议中的 "POST" 操作来发送。 要发送文件,在文件名前面加上@前缀并使用完整路径。 文件类型可在文件名后以 ";type=mimetype" 的格式指定。 这个参数可以是 urlencoded 后的字符串,类似"val1=1&val2=2&...",也可以使用一个以字段名为键值,字段数据为值的数组。

通过 cURL 发送 POST 请求来实现文件上传:

 $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);
3. 文件下载

其实,文件下载与普通 GET 请求是一样的,只是文件下载把返回内容保存至文件中,而不是简单的输出。配合 file_put_contents() 函数实现文件下载:

 $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");
4. HTTP 认证

如果服务器端需要验证请求,设置 CURLOPT_USERPWD 参数即可:

 $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");
5. 模拟登录

这里主要展示模拟登录使用了 Cookie 来保持登录状态的应用。首先我们需要通过账号密码登录获取到 Cookie 数据,然后利用已登录的 Cookie 获取页面数据:

 $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);
}
cURL 封装库

PHP Curl Class 是一个编写得很好的 cURL 封装库,它可以非常方便地发送 HTTP 请求并与任何类型的 Web API 集成。PHP Curl Class 封装库适用于 PHP 5.3,5.4,5.5,5.6,7.0,7.1 和 HHVM。这个库是众所周知的,并提供了一个非常简单的语法:

get("https://www.example.com/");

if ($curl->error) {
    echo "Error: " . $curl->errorCode . ": " . $curl->errorMessage . "
";
} else {
    echo "Response:" . "
";
    var_dump($curl->response);
}

参考文章:

Client URL 库

php中的curl使用入门教程和常见用法实例

在PHP中使用CURL,“撩”服务器只需几行——php curl详细解析和常见大坑

Top 7: Best Curl Wrapper Libraries for PHP

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28555.html

相关文章

  • php平滑升级

    摘要:错误发生点在建立是出错,没給到要的函式库参数。第二种解决方法升级情况说明是默认使用安装为,现有项目需要支持。当前版本输出信息下载最新的开始升级关闭开启删除原有的动态库将新动态库放到对应位置刷新动态库添加升级后查看版本版本信息 php平滑升级 1.既然是平滑升级,是不需要宕机,也不需要停止服务,是不存在关闭网站的说法 2.而升级最后的重启,重启的是PHP加载的配置文件,不影响你当前运行的...

    AlexTuan 评论0 收藏0
  • PHP回顾之IO

    摘要:命令行时返回值为,标准输入输出均指向终端可用进程号查看。会在脚本执行完毕后关闭三个流,无需用户手动关闭。与远程网址交互是一个请求和响应的过程,其中细节可参考本人之前的文章回顾之请求和回顾之响应,也可参考协议的权威文档。 转载请注明文章出处: https://tlanyan.me/php-review... PHP回顾系列目录 PHP基础 web请求 cookie web响应 ses...

    happen 评论0 收藏0
  • 基于haddop的HDFS和Excel开源POI导出大数据报表(一)

    摘要:说明这里用到的项目都是基于的项目。但同时,它和其他的分布式文件系统的区别也是很明显的。能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。放宽了一部分约束,来实现流式读取文件系统数据的目的。是项目的一部分。 关键词 Java、PHP、hdfs、mqrocket、excel、poi、报表 需求背景 在业务需求方面,每个企业或多或少都会有报表导出的作业,量少则可是使用输出流或者字符串的...

    Nekron 评论0 收藏0
  • 基于haddop的HDFS和Excel开源POI导出大数据报表(一)

    摘要:说明这里用到的项目都是基于的项目。但同时,它和其他的分布式文件系统的区别也是很明显的。能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。放宽了一部分约束,来实现流式读取文件系统数据的目的。是项目的一部分。 关键词 Java、PHP、hdfs、mqrocket、excel、poi、报表 需求背景 在业务需求方面,每个企业或多或少都会有报表导出的作业,量少则可是使用输出流或者字符串的...

    luffyZh 评论0 收藏0
  • PHP7.0.0在OS X编译安装

    摘要:目前支持和协议。除此以外,还能在可能的字符编码之间相互进行编码转换。如果启用了这个功能,输入字符编码可能将自动转换成。这些可能在未来增加。 前言 PHP7即将在12月3日正式发布,而RC8是已经差不多稳定了的版本,后续的GA版本主要都是在修复bug,所以为了未来开发环境的升级,准备尝试安装一下。 PHP7.0.0将在12月3日正式发布,但是12月2日时github已经发布出PHP-7...

    lordharrd 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<