PHP 請求用 cURL 還是用 guzzle?

seeker-x2y發表於2020-03-24

在這裡插入圖片描述
(圖片來源自網路,侵刪)

之前編寫請求相關的業務邏輯,一直使用 php-curl-class/php-curl-class 這個包,後來由於要引入soap的使用,故而順帶研究了一下 cURL 與 guzzle 的異同,網上查閱資料整理成本篇文章。

當然,適合自己的才是最好,凡事終歸是小馬過河,下邊是正文:

什麼是 cURL ?它是使用 URL 傳輸資料的命令列工具和庫,用於在命令列或指令碼中傳輸資料。它也用於汽車,電視機,路由器,印表機,音訊裝置,行動電話,平板電腦,並且是數千種每天影響著數十億人的軟體應用程式的網際網路傳輸骨幹網。

什麼是 Guzzle ? 它是一個 PHP HTTP 客戶端,可以輕鬆傳送 HTTP 請求,並輕鬆與 Web 服務整合。 Guzzle 是一個 PHP HTTP 客戶端,可以輕鬆傳送 HTTP 請求,並且可以輕鬆地與 Web 服務整合。

cURL 可以歸類為“檔案傳輸”類別中的工具,而 Guzzle 則歸類於“微框架(後端)”下。

cURLGuzzle 都是開源工具,在 GitHub上, Guzzle 似乎比 cURL 更受歡迎。

PHP/cURL 的侷限性

我們不得不承認,說下邊這些是 PHP/cURL 的侷限性,這似乎有些誤導。我們通過將 PHP/cURL 直接與 Guzzle 的優勢進行比較來解釋 PHP/cURL 的侷限性的說法。如果您正在構建一個簡單的指令碼,而只需要幾行 PHP/cURL 程式碼就可以進行 HTTP 呼叫,那麼您就不必擔心測試和程式碼質量。使用 PHP/cURL 完全可以。實際上,只要您感到合適就可以繼續使用 PHP/cURL。 PHP / cURL沒有真正的技術限制。因此,有了這個免責宣告,我們繼續。

下邊列出幾個使用 PHP/cURL 時的侷限性:

  • 由於 PHP/cURL 使用 libcurl,而 libcurl 使用curl。這是安裝命令列工具 curl 的必要條件。如果使用共享主機,則可能沒有安裝軟體包的許可權。
  • PHP/cURL 提供了一系列使用 curl 的選項,如其官方文件所示。一方面,它很好,因為它提供了很大的靈活性。另一方面,它太冗長而無法使用。它沒有提供最令人愉快的API。
  • 如果使用的是 PHP/cURL ,則單元測試會很麻煩。沒有對單元測試的現成支援。

Guzzle 簡介

以下是Guzzle官方網站上的官方說明:

Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and trivial to integrate with web services.

讓我們看看Guzzle如何克服我們先前所說的 PHP/cURL的那些侷限性。

  首先, Guzzle 是 HTTP 請求的抽象層。它對PHP/cURL,PHP流,套接字或非阻塞事件迴圈沒有硬性依賴。它封裝了底層的 HTTP 傳輸。如果需要,可以使用PHP/cURL,但這不是必須的。因此,在共享託管環境中,如果PHP/cURL不可行,則可以使用其他替代方法。

  其次,Guzzle 提供了非常乾淨的 API 來使用。在使用庫時,文件非常重要。Guzzle 通過提供全面的文件來做得很好。從技術上講,Guzzle 用物件導向的程式設計編寫得很好,它使用 PSR-7 作為 HTTP 介面。這意味著它可以與任何其他庫相容,只要它們與 PSR-7 介面相容即可。

  最後,Guzzle 具有內建的單元測試支援。它提供了一種比較簡單的方法來模擬 HTTP 層。檢視其文件以獲取更多詳細資訊。

使用 Guzzle

使用Composer安裝Guzzle。 在撰寫本文時,Guzzle的最新版本是 6.0 。

composer require guzzlehttp/guzzle:~6.0

建立一個入口檔案 index.php 幷包含 Composer 自動載入檔案。 同時,我們將匯入Guzzle類:

<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;

使用 Google 的根 URL 例項化 Guzzle 客戶端物件:

$client = new Client([
    'base_uri' => 'http://www.google.com',
]);

向 Google 的搜尋 URI 發出 GET 請求。同時,我們傳遞查詢引數 q

$response = $client->request('GET', 'search', [
    'query' => ['q' => 'curl']
]);

最後,我們將輸出響應資料:

echo $response->getBody();

完整的程式碼如下所示:

<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'http://www.google.com',
]);

$response = $client->request('GET', 'search', [
    'query' => ['q' => 'curl']
]);

echo $response->getBody();

如您所見,由於 Guzzle 可靠的 OOP 設計,上面的程式碼幾乎是不言自明的。

最後

本文參考了:

  1. From PHP/cURL to Guzzle
  2. cURL vs Guzzle
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章