PHP - 为啥使用 Guzzle 而不是 cURL?

Posted

技术标签:

【中文标题】PHP - 为啥使用 Guzzle 而不是 cURL?【英文标题】:PHP - Why Use Guzzle Instead of cURL?PHP - 为什么使用 Guzzle 而不是 cURL? 【发布时间】:2016-08-01 13:47:13 【问题描述】:

在我的应用程序中,我最初开始使用 cURL 从各种 API 检索数据。今天,我尝试使用 Guzzle 完成相同的任务。到目前为止,cURL 和 Guzzle 似乎都同样好用。

从Github 来看,很多人似乎都喜欢 Guzzle,但我不明白为什么。

我的问题:

对于我的情况(从各种 API 检索数据),使用 Guzzle 是否更可取?如果我使用 cURL 代替 Guzzle(反之亦然),我最终会后悔吗?

我正在使用 php/Laravel。

【问题讨论】:

如果可能,Guzzle 在内部使用 cURL,因此它不像包装器那样可以替代。使用 Guzzle 而不是 cURL 的主要好处是它提供的 API,这会产生更简洁和可读的代码。例如查看this question 中的代码和接受的答案之间的区别,cURL 代码比 Guzzle 实现要冗长得多。 【参考方案1】:

为什么要使用 Guzzle?

首先,Guzzle 是一个 http 请求的抽象层,虽然它默认使用 cURL,但你可以使用任何其他你想要的 http 客户端:

Guzzle 需要 cURL 吗?

没有。 Guzzle 可以使用任何 HTTP 处理程序来发送请求。这意味着 Guzzle 可以与 cURL、PHP 的流包装器、套接字和 像 React 这样的非阻塞库。你只需要配置一个 HTTP 处理程序使用不同的方法发送请求

注意: Guzzle 过去只使用 cURL 来发送 HTTP 请求。 cURL 是一个了不起的 HTTP 客户端(可以说是最好的),而 Guzzle 将 可用时默认继续使用。很少见,但是 一些开发人员没有在他们的系统上安装 cURL 或遇到 版本特定问题。通过允许可交换的 HTTP 处理程序,Guzzle 现在更加可定制并且能够适应 更多开发者。

由于您使用的是 Laravel,如果您有任何机会使用任何电子邮件 API,那么现在您已经安装了 Guzzle。在你的 Laravel 的 composer.json 上你可以看到一个建议:

"suggest": 
    ...
    "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~5.3|~6.0).",
    ...

另一个原因是重用代码,看看bogdan 的评论,用cURL 做一个简单的http 请求所需的代码量。使用 Guzzle 更简单、更清洁、更易阅读和可重用。创建一个封装 Http 请求的服务非常容易。

Guzzle 还允许您执行 async requests,这与您使用 Promise 处理 javascript 的方式非常相似。

最后但同样重要的是,测试!与使用 cURL 相比,使用 Guzzle 对您的 API 进行测试或为您的应用程序创建单元测试并模拟 http 请求要容易得多。有关测试的更多信息here

但是如果您只想执行 几个 简单的 http 请求(似乎并非如此),那么您不必关心测试和你不想依赖 Guzzle 去 cURL。

【讨论】:

谢谢。你已经完全说服我应该使用 Guzzle。 需要更多关于a couple of simple http requests的信息。请求 UPSDHL 等 API 的复杂程度足以使用 Guzzle 而不是 cUrl @hellboy 这由你决定,我会大吃一惊,但除非出于某种原因,你是一个纯粹主义者并且不想使用外部库,或者如果添加一行到你的作曲家不值得努力,卷曲棒【参考方案2】:

Guzzle 是 cURL 就像 axios 是 XMLHttpRequest。

【讨论】:

【参考方案3】:

Guzzle 是 HTTP 传输的抽象层,它恰好在可用的情况下使用 cURL。

除上述之外,虽然您可以使用 cURL 自己完成所有操作,但 Guzzle 极大地简化了事情,尤其是在调试方面。

【讨论】:

以上是关于PHP - 为啥使用 Guzzle 而不是 cURL?的主要内容,如果未能解决你的问题,请参考以下文章

Guzzle 异步请求不是真正的异步?

在 Guzzle 中设置代理

PHP 使用 Guzzle 执行 HTTP 请求

PHP 使用 Guzzle 执行 HTTP 请求

为啥在 PHP 中使用 PDO 而不是 MySQL? [复制]

php [guzzle php] guzzle php #php