Composerを使ってGuzzle HTTPクライアントをインストール、HTTPリクエストしてみた

PHPのCompoerへの理解を深めるために、ライブラリをインストールしてプログラミングしてみます。今回はGuzzle HTTPクライアントをインストールして、HTTPリクエストしてみました。

開発環境

ソフトウェアバージョン
macOS14.2
php8.3.2
composer2.6.6

guzzlehttp/guzzle とは

https://packagist.org/packages/guzzlehttp/guzzle

guzzlehttp/guzzle とは、Comoser でインストール可能な PHP の HTTP client library です。公式ページによれば、次のようにしてHTTPリクエストを行うことが可能になります。
php
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle');

echo $response->getStatusCode(); // 200
echo $response->getHeaderLine('content-type'); // 'application/json; charset=utf8'
echo $response->getBody(); // '{"id": 1420053, "name": "guzzle", ...}'

// Send an asynchronous request.
$request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org');
$promise = $client->sendAsync($request)->then(function ($response) {
    echo 'I completed! ' . $response->getBody();
});

$promise->wait();

guzzlehttp/guzzle のインストール

適当なワーキングディレクトリを作成して、そこへ移動してから composer require guzzlehttp/guzzle を実行します。

bash
$ composer require guzzlehttp/guzzle
./composer.json has been created
Running composer update guzzlehttp/guzzle
Loading composer repositories with package information
Updating dependencies
Lock file operations: 8 installs, 0 updates, 0 removals
  - Locking guzzlehttp/guzzle (7.8.1)
  - Locking guzzlehttp/promises (2.0.2)
  - Locking guzzlehttp/psr7 (2.6.2)
  - Locking psr/http-client (1.0.3)
  - Locking psr/http-factory (1.0.2)
  - Locking psr/http-message (2.0)
  - Locking ralouphie/getallheaders (3.0.3)
  - Locking symfony/deprecation-contracts (v3.4.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 8 installs, 0 updates, 0 removals
  - Installing symfony/deprecation-contracts (v3.4.0): Extracting archive
  - Installing psr/http-message (2.0): Extracting archive
  - Installing psr/http-client (1.0.3): Extracting archive
  - Installing ralouphie/getallheaders (3.0.3): Extracting archive
  - Installing psr/http-factory (1.0.2): Extracting archive
  - Installing guzzlehttp/psr7 (2.6.2): Extracting archive
  - Installing guzzlehttp/promises (2.0.2): Extracting archive
  - Installing guzzlehttp/guzzle (7.8.1): Extracting archive
2 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
4 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found.
Using version ^7.8 for guzzlehttp/guzzle

実行結果の通り、guzzlehttp/guzzle に依存するライブラリも同時にインストールされていることがわかります。

インストール後のディレクトリ

composerを使ってライブラリをインストールすると、composer.jsoncomposer.lockといったファイルが生成されます。そしてvendorディテクトりに、ライブラリが格納されます。

bash
$ tree -L 2                                                                                    9:02:57
.
├── composer.json
├── composer.lock
└── vendor
    ├── autoload.php
    ├── composer
    ├── guzzlehttp
    ├── psr
    ├── ralouphie
    └── symfony

composer.json

生成された composer.json パッケージのバージョンがキャレット演算子で指定されています。これは、次のメジャーバージョンまでのすべての変更を利用可能にするものです。下記の場合 >=7.8 <8.0 に相当します。

composer.json
{
    "require": {
        "guzzlehttp/guzzle": "^7.8"
    }
}

Guzzle HTTPクライアントを使ったリクエスト

それでは実際にPHPでGuzzle HTTPクライアントを使ったテストを行います。

サンプルコードその1

main.php
<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle');

echo $response->getStatusCode();
echo $response->getHeaderLine('content-type');
echo $response->getBody();

解説

このようにGuzzle HTTPクライアントを使うことで、HTTPリクエストをわかりやすく記述することができます。 require 'vendor/autoload.php'; はオートローダーという仕組みで、インストールしたパッケージから外部ファイルやクラスなどを自動で読み込んでくれ流ため、いちいち必要なクラスを取り込むために includerequire で記述せずに済みます。 use GuzzleHttp\Client; で名前空間を指定して、クラスやメソッドを使いやすくします。

サンプルコードその2

今度は、PSR-7リクエストを使って非同期でHTTPリクエストを実行してみます。

main.php
<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;

$client = new Client();
$request = new Request('GET', 'http://apppppp.com/jojo.json');

$promise = $client->sendAsync($request)->then(function ($response) {
    // 非同期で実行される
    echo '②I completed! ' . $response->getBody();
});

echo "①先に処理する\n";

$promise->wait();

echo "③待ってから処理する\n";

解説

sendAsync で非同期でHTTPリクエストを投げ、レスポンスが完了したところでthenメソッド内のクロージャ(無名関数)が実行されます。ですから、echo "①先に処理する\n";が先に実行されるはずです。その後の記述 $promise->wait(); では、非同期リクエストが完了するまで待機します。ですから、クロージャが実行された後に、echo "③待ってから処理する\n";が実行されるわけです。

よって、このプログラムを実行すると、次のような結果となるはずです。

bash
$ php main.php
①先に処理する
②I completed! { 
"name":"Jyotaro",
"stand":"The World"
}
③待ってから処理する

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム