hnwの日記

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

PHPで最近注目のHTTPクライアントライブラリにGuzzleがあります。日本での知名度はまだまだという印象ですが、かなり高機能かつ真面目にメンテナンスされている印象で、今後のデファクトスタンダードになりうるライブラリと言えるでしょう。


本稿ではこのGuzzleを使ってWebサーバから並行にダウンロードする方法を紹介します。Webブラウザのように同時に複数コネクションを管理しながらKeep-Aliveでコネクションを使い回しますので、下手なコードで実現するより接続先Webサーバにも優しいはずです。

Guzzleの特徴

まずは、Guzzleについて僕が特徴的だと思う点を紹介します。

  • パッと見でわかりやすいインターフェース
  • cURLは必須ではないがデフォルトでcURLを使う
    • cURLの無い環境がありうるので、cURL無しでも動くのは嬉しい
    • cURLのわかりにくいインターフェースを隠してくれるのも嬉しい
  • イベントフック(リクエストの前後などでフック可能)の導入
  • Composer対応
  • クッキー、OAuth、キャッシュ、ロギングなど多くのプラグインを提供


欠点は巨大すぎることと、マニュアルの日本語訳がまだ無いことくらいでしょう。

Guzzleのバージョン

Guzzleを使う上で、Guzzleのバージョンには要注意です。GuzzleにはGuzzle 3とGuzzle 4と2つのバージョンがあります。同じ機能でもGuzzle 3とGuzzle 4とでメソッド名が変わっていたりするので、検索で見つけた記事を読むような場合は注意してください。


Guzzle 3とGuzzle 4は異なるネームスペースを利用していますので、どちらを使っているかは一目瞭然です。Guzzle 3の名前空間は「\Guzzle\」から始まり、Guzzle 4は「\GuzzleHttp\」から始まります。


また、Packagistでのパッケージ名もGuzzle 3は「guzzle/guzzle」、Guzzle 4+は「guzzlehttp/guzzle」となっていますので、composer.jsonに書く際も注意が必要です。


Guzzle 4は今年の3月にリリースされたばかりですが、今から使うならこちらを使った方が良いでしょう。本稿でもGuzzle 4を利用しています。

並行ダウンロードするサンプルコード

Guzzleの一般的な使い方は他のページを見て頂くとして、早速並行ダウンロードのサンプルコードを紹介します。このコードはジェネレータを使いたかったのでPHP 5.5以降でしか動作しませんが、Guzzle 4はPHP 5.4以降で動くはずです。

続きを読む