Composerを使ってGuzzle HTTPクライアントをインストール、HTTPリクエストしてみた
PHPのCompoerへの理解を深めるために、ライブラリをインストールしてプログラミングしてみます。今回はGuzzle HTTPクライアントをインストールして、HTTPリクエストしてみました。
開発環境
ソフトウェア | バージョン |
---|---|
macOS | 14.2 |
php | 8.3.2 |
composer | 2.6.6 |
guzzlehttp/guzzle とは
https://packagist.org/packages/guzzlehttp/guzzle
guzzlehttp/guzzle とは、Comoser でインストール可能な PHP の HTTP client library です。公式ページによれば、次のようにしてHTTPリクエストを行うことが可能になります。$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 を実行します。
$ 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.jsonやcomposer.lockといったファイルが生成されます。そしてvendorディテクトりに、ライブラリが格納されます。
$ 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 に相当します。
{
"require": {
"guzzlehttp/guzzle": "^7.8"
}
}
Guzzle HTTPクライアントを使ったリクエスト
それでは実際にPHPでGuzzle HTTPクライアントを使ったテストを行います。
サンプルコードその1
<?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'; はオートローダーという仕組みで、インストールしたパッケージから外部ファイルやクラスなどを自動で読み込んでくれ流ため、いちいち必要なクラスを取り込むために include や require で記述せずに済みます。 use GuzzleHttp\Client; で名前空間を指定して、クラスやメソッドを使いやすくします。
サンプルコードその2
今度は、PSR-7リクエストを使って非同期でHTTPリクエストを実行してみます。
<?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";が実行されるわけです。よって、このプログラムを実行すると、次のような結果となるはずです。
$ php main.php
①先に処理する
②I completed! {
"name":"Jyotaro",
"stand":"The World"
}
③待ってから処理する