読者です 読者をやめる 読者になる 読者になる

takedajs ログ

備考録

PHPでHTTP並行リクエスト処理を行う

PHP Guzzle

PHPで複数のAPIから並行でデータを取得するために、PHPのHTTPクライアントライブラリである「Guzzle」のsendAllメソッドを利用してみました。
検証として、直列と並行でのデータ取得時間を比較しています。

今回の記事は、サーバにGuzzleが導入してある前提で書いています。
まだ導入されていない方は、こちらの記事を参考に導入まで行ってみてください。

開発環境

  • Vagrantで構築
  • OS: CentOS7
  • PHP: 5.6.30
  • Guzzle: 4.2

検証用コード

Guzzleでデータを直列に取得するパターン(send.php)と、並列に取得するパターン(sendAll.php)のコードを書きました。
コードの内容は、作成したAPIに扮したページ(api.php)から取得したデータを表示させています。

send.php(直列取得)

sendAll.php(並列取得)

api.php

send.phpとsendAll.phpとも以下のような情報が取得できます。
APIごとに配列に要素名を指定して実装しているので、APIごとのデータの扱いが簡単です。

実行結果

array(3) {
  ["no_1"]=>
  string(1) "1"
  ["no_2"]=>
  string(1) "2"
  ["no_3"]=>
  string(1) "3"
}

検証結果

直列と並列取得での処理速度の結果(3回計測の平均値)です。
APIの処理がだいたい5秒なので、計測結果から上手く並列で情報が取れていたことが分かります。

直列取得(send.php)
約15.13秒

並列取得(sendAll.php)
約5.12秒

まとめ

GuzzleのsendAllメソッドを利用することで、PHPで並行リクエスト処理を行えることが分かりました。
sendAllを利用して実装している記事が少なく、API側から取得した情報を表示するのに苦労しましたが、何とかできて良かったです。
サイトパフォーマンス的に並行処理はかなり貢献度が大きいと思うので、Guzzleで簡単にできるのはありがたいですね。

次は、Guzzle5から利用できるようになった、非同期処理ができるGuzzle Promiseを試してみたいと思います。

参考

PHPでHTTPの並行ダウンロードを実現する(Guzzle編) - hnwの日記

Clients — Guzzle Documentation

Guzzle Promiseを使った 非同期処理によるAPIコールの高速化 - SSSSLIDE