• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

如何在PHP中使用cURL

在日常 php 开发中,您经常需要与外部网站进行交流。无论是调用第三方rest api来获取 数据还是从外部网站下载资源,您都需要一个可以让您轻松完成的库。

在 PHP 中,您可以使用不同的方法来连接不同类型的服务器并与之通信。最简单的方法之一是使用该file_get_contents函数读取远程文件。另一方面,您也可以使用socket来实现客户端-服务器通信。不过,在本文中,我们将通过实际示例详细讨论curl 扩展。

cURL 代表客户端 URL,它是一个允许您使用 URL 语法发送和接收信息的库。事实上,它利用了由 Daniel Stenberg 创建的 libcurl 库,它允许您使用许多不同类型的协议连接到许多不同类型的服务器并与之通信。除了 HTTP 和https之外,libcurl 库还支持 FTP、Gopher、Telnet、DICT、File 和 LDAP 等协议。

从下一节开始,我们将通过几个实际示例来演示如何在 PHP 中使用 cURL 函数。

真实世界的例子

在本节中,我们将构建真实世界的示例来演示 PHP 中的各种 cURL 函数。

如何在 PHP 中使用 cURL 下载文件

读取或下载远程文件是 cURL 最常见的用例之一。这是通过 cURL GET 请求完成的,我们将在本节中讨论。

继续并使用以下内容创建curl_read_file.php文件。

<?php
$url = 'https://www.example.com';

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);

$data = curl_exec($curl);

curl_close($curl);

在上面的示例中,我们使用 cURL 函数来读取example.com dom ain 的主页。让我们通过重要的片段来了解它是如何工作的。

首先,我们使用该curl_init函数来初始化一个新的 cURL 会话。该$curlHandle变量包含一个 cURL 句柄,我们可以使用它在curl_setopt函数的帮助下设置 cURL 传输的各种选项。

当您使用 cURL 时,该curl_setopt函数是您主要处理的函数,因为它允许您初始化各种CURLOPT_*请求选项。该curl_setopt函数接受三个参数:cURL 句柄、CURLOPT_XXX选项和选项的值CURLOPT_XXX。

接下来,我们使用该CURLOPT_URL选项将请求 URL 设置example.com为curl_setopt函数。此外,我们将CURLOPT_RETURNTRANSFER选项设置TRUE为我们希望将响应初始化为$responseData变量。如果我们不将其设置为TRUE,则响应将直接显示在屏幕上。最后,我们将CURLOPT_HEADER选项设置FALSE为跳过输出中的标题信息。

最后,我们使用该curl_exec函数来执行 cURL 请求。如果一切顺利,$responseData变量应该包含主页的来源example.com。

如何在 PHP 中使用 cURL发布数据

在本节中,我们将了解如何使用 cURL 发布数据。

让我们使用以下内容创建curl_post_example.php文件。

<?php
$url = '{POST_REST_ENDPOINT}';

$curl = curl_init();

$fields = array(
    'field_name_1' => 'Value 1',
    'field_name_2' => 'Value 2',
    'field_name_3' => 'Value 3'
);

$fields_string = http_build_query($fields);

curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string);

$data = curl_exec($curl);

curl_close($curl);

在上面的示例中,我们假设我们需要使用 HTTP POST 方法提交请求。事实上,它的工作原理类似于使用 POST 方法提交表单。

该$fields变量包含我们需要作为 POST 数据提交的值数组。接下来,我们使用该http_build_query函数准备了一个 URL 编码的查询字符串。

接下来,我们将CURLOPT_POST选项TRUE设置为将请求方法设置为 HTTP POST。此外,我们需要使用该CURLOPT_POSTFIELDS选项来设置我们要与请求一起提交的 POST 数据。

最后,我们使用该curl_exec函数来执行 cURL 请求。因此,通过这种方式,您可以发出 cURL POST 请求。

如何在 PHP 中使用 cURL 发布 JSON 数据

通常,您需要在 cURL POST 请求中提交 JSON 数据。在本节中,我们将了解如何在 cURL 请求中使用 POST 方法提交 JSON 数据。

由于它是一个 POST 请求,让我们修改一下我们刚刚在上一节中讨论过的示例。继续并使用以下内容创建curl_post_json.php文件。

<?php
$url = '{POST_REST_ENDPOINT}';

$curl = curl_init();

$fields = array(
    'field_name_1' => 'Value 1',
    'field_name_2' => 'Value 2',
    'field_name_3' => 'Value 3'
);

$json_string = json_encode($fields);

curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, $json_string);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true );

$data = curl_exec($curl);

curl_close($curl);

尽管它可能看起来与上一节中的示例相似,但重要的是我们已经使用该json_encode函数从$fields数组中创建了一个 JSON 字符串。

接下来,我们使用CURLOPT_HTTPHEADER选项将Content-Type标头设置application/json为通知 API 服务器我们正在发送 JSON 数据。标Content-Type头对于以不同格式发布数据很有用。例如,如果您想发送 XML 数据,则必须将Content-Type标头设置为application/xml.

除此之外,它与常规 POST 请求几乎相同。所以通过这种方式,你可以通过设置合适的Content-Typeheader来发布不同类型的数据。如果您不设置Content-Type标题,它将application/x-www-form-urlencoded用作默认值。

如何在 PHP 中使用 cURL 上传文件

在本节中,我们将讨论如何使用 cURL 上传文件。

让我们使用以下内容创建curl_post_file.php文件。

<?php
$url = '{POST_REST_ENDPOINT}';

$curl = curl_init();

if (function_exists('curl_file_create')) {
  $fileAttachment = curl_file_create('/absolute/path/to/file/');
} else {
  $fileAttachment = '@' . realpath('/absolute/path/to/file/');
}

$fields = array(
    'field_name_1' => 'Value 1',
    'field_name_2' => 'Value 2',
    'field_name_3' => 'Value 3',
    'uploaded_file' => $fileAttachment
);

curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, $fields);
curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);

$data = curl_exec($curl);

curl_close($curl);

当您要上传文件时,首先需要创建一个CURLFile对象。从 PHP 5.5+ 开始,创建它相当容易,因为您只需要使用该curl_file_create函数来创建一个CURLFile对象。该curl_file_create函数的第一个参数是您要上传的文件的绝对路径。

如果您仍在使用较旧的 PHP 版本(不推荐),我们已使用后备'@' . realpath('/absolute/path/to/file/')语法来创建文件链接。

最后,我们将Content-Type标头设置为,multipart/form-data因为它将是一个多部分表单 POST 请求。除此之外,这是一个常规的 cURL POST 请求。

到目前为止,我们已经了解了 PHP 中常用的几种不同的 cURL 方法。在下一节中,我们将了解如何使用Guzzle库,它可以让您在 PHP 中处理 HTTP 请求时变得更轻松。

什么是 Guzzle HTTP 客户端?

根据官方文档:

Guzzle 是一个 PHP HTTP 客户端,可以轻松发送 HTTP 请求并轻松与 Web服务集成。

让我们快速了解一下在 cURL PHP 函数上使用 Guzzle 的好处:

  • 用于不同类型数据的简单界面

  • 支持同步和异步hronous 请求

  • 支持 cURL、套接字和 PHP 流

  • 符合 PSR-7 标准

  • 和更多

总而言之,当您想使用不同的方法进行 HTTP 调用时,它是最好的库之一。在本节中,我们将讨论如何安装 Guzzle,然后通过几个快速示例来展示这个库的强大功能!

如何安装 Guzzle 库

官方文档建议您使用 Composer 安装 Guzzle。让我们运行以下命令在您的项目中安装 Guzzle。

$composer require guzzlehttp/guzzle:^7.0
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 6 installs, 0 updates, 0 removals
  - Installing psr/http-message (1.0.1): Loading from cache
  - Installing psr/http-client (1.0.1): Loading from cache
  - Installing ralouphie/getallheaders (3.0.3): Loading from cache
  - Installing guzzlehttp/psr7 (1.7.0): Loading from cache
  - Installing guzzlehttp/promises (1.4.1): Loading from cache
  - Installing guzzlehttp/guzzle (7.2.0): Loading from cache
guzzlehttp/psr7 suggests installing laminas/laminas-httphandlerrunner (Emit PSR-7 responses)
guzzlehttp/guzzle suggests installing psr/log (Required for using the Log middleware)
Writing lock file
Generating autoload files

安装后,您需要使用 Composer 的自动加载器,如以下代码段所示。

require 'vendor/autoload.php';

有了这个,你就可以使用 Guzzle 了!

如何使用 Guzzle 发出 GET 请求

在本节中,我们将了解如何使用 Guzzle 发送 GET 请求。

我们将修改我们之前讨论过的示例,因为它将帮助您了解如何将现有 cURL PHP 代码转换为基于 Guzzle 的实现。

让我们看一下修改后的示例。

<?php
require 'vendor/autoload.php';

$client = new \GuzzleHttp\Client();
$response = $client->get('https://example.com');

$responseContents = $response->getBody();

这不是直截了当吗?我们已经创建了\GuzzleHttp\Client该类的一个实例,并将其分配给$client变量。现在,您可以访问\GuzzleHttp\Client该类提供的大量实用方法。

在我们的例子中,我们需要使用 GET 方法获取内容,所以我们使用了类的get方法\GuzzleHttp\Client,它会返回GuzzleHttp\Psr7\Response对象。该GuzzleHttp\Psr7\Response对象提供各种方法,如getStatusCode、getBody、getReasonPhrase等。我们已经使用该getBody方法来获取响应正文内容。

这就是您可以使用 Guzzle 执行 HTTP GET 请求的方式。

如何使用 Guzzle 发出 POST 请求

在本节中,我们将了解如何使用 Guzzle 执行 HTTP POST 请求。

我们将修改我们在前面部分中讨论过的curl_post_example.php示例。使用 Guzzle 修改后的代码如下所示。

<?php
require 'vendor/autoload.php';

$client = new \GuzzleHttp\Client();
$options = [
    'form_params' => [
        "field_name_1" => "Value 1",
        "field_name_2" => "Value 2",
        "field_name_3" => "Value 3",
    ]
];

$response = $client->post("{POST_REST_ENDPOINT}", $options);
$responseContents = $response->getBody();
?>

由于这是一个 POST 请求,我们需要将$options数组作为post方法的第二个参数传递。在我们的示例中,它包含我们需要作为 POST 数据提交的表单数据。

如果您想知道如何发布 JSON 数据,只需将form_params密钥更改为json,数据将以 JSON 格式发送!

此外,如果您想随请求一起发送任何 HTTP 标头,您可以使用headers密钥来执行此操作,如以下代码段所示。

...
...
$headers = array(
    'Content-Type'   => 'application/json'
);
$options = [
    'form_params' => [
            "field_name_1" => "Value 1",
            "field_name_2" => "Value 2",
            "field_name_3" => "Value 3",
    ],
    ‘headers’ => $headers
];
...
...

事实上,Guzzle 库为每种方法提供了很多配置选项。此外,有多种方法可以做同样的事情,所以我鼓励你详细探索它,我相信它会很有趣!

以上就是对 Guzzle 库以及 PHP cURL 函数的快速介绍。

结论

今天,我们探讨了 PHP 中 cURL 扩展的基础知识。我们讨论了如何在 PHP 中使用 cURL 执行不同类型的 HTTP 请求。此外,我们还快速介绍了 Guzzle 库,它使开发人员在处理 PHP 中的 HTTP 请求时更加轻松。


文章目录
  • 真实世界的例子
    • 如何在 PHP 中使用 cURL 下载文件
    • 如何在 PHP 中使用 cURL发布数据
    • 如何在 PHP 中使用 cURL 发布 JSON 数据
    • 如何在 PHP 中使用 cURL 上传文件
  • 什么是 Guzzle HTTP 客户端?
    • 如何安装 Guzzle 库
    • 如何使用 Guzzle 发出 GET 请求
    • 如何使用 Guzzle 发出 POST 请求
  • 结论