ハマログ

株式会社イーツー・インフォの社員ブログ

PHPのcurlを卒業して、Guzzleを使う。の巻

PHPでHTTP通信するときに、PHP組み込みのcURL(Client URL Library)を利用していたのですが、インターフェースが古い感じで、例外処理もやりにくくて、なんだかなーと思っていたのですが、ちゃんと動くし、マルチハンドルもできるし、まいっかと思っていました。

が、いい加減いいやりかたあるだろうと調べてみたところ、Guzzle がよさそうなので、使ってみました。

いまさら、という感じですね。

Guzzleとは

Guzzleとは、PHPのHTTPクライアントで、HTTPリクエストを簡単に実現することができるライブラリです。

特長
・PSR-7(HTTP message interfaces)準拠!
・同期/非同期通信に対応
・Simple interface for building query strings, POST requests, streaming large uploads, streaming large downloads, using HTTP cookies, uploading JSON data, etc...(引用)

なかなか良さそうです。

Guzzleをつかってみる

使ってみます。composerでライブラリを入手します。

php composer.phar require guzzlehttp/guzzle
今回は(今回も)、Laravelで試してみました。

composer.json
{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.6.4",
        "laravel/framework": "5.4.*",
        "laravel/tinker": "~1.0",
        "laravelcollective/html": "5.4.*",
        "guzzlehttp/guzzle": "^6.1"
    },
    "require-dev": {
// 略
}
composer updateを実行して準備完了です。

useして、
use GuzzleHttp\Client;
コード書きます
$client = new Client();
$response = $client->request('GET', 'https://www.yahoo.co.jp/');
echo $response->getStatusCode();
die();
エラー
Whoops, looks like something went wrong.
(1/1) RequestException
cURL error 60: SSL certificate problem: unable to get local issuer certificate (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
調べて見ると、GuzzleはcURLのラッパーとのことで、cURL同様に、SSLの場合証明書の検証を標準でするらしい。

とりあえず手を抜いて証明書の検証をしないように設定。
$client = new Client();
$response = $client->request('GET', 'https://www.yahoo.co.jp/', ['verify' => false]);
echo $response->getStatusCode();
die();
成功
200
つづいてレスポンスボディを取得してみます。
$client = new Client();
$response = $client->request('GET', 'https://www.yahoo.co.jp/', ['verify' => false]);
echo $response->getBody();
die();
またもやエラー。ちゃんとドキュメント見て書いたのに!
(1/1) ErrorException
Object of class GuzzleHttp\Psr7\Response could not be converted to string
どうやらオブジェクトが返ってきているようなので、確認してみる。
$client = new Client();
$response = $client->request('GET', 'https://www.yahoo.co.jp/', ['verify' => false]);
echo get_class($response->getBody());
die();
あー。そりゃそうやろ。
GuzzleHttp\Psr7\Stream
ということで、PSR側の仕様をよみつつ、StreamInterfaceのgetContentsを実行してみる。
$client = new Client();
$response = $client->request('GET', 'https://www.yahoo.co.jp/', ['verify' => false]);
echo $response->getBody()->getContents();
die();
成功
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="content-style-type" content="text/css">
<meta http-equiv="content-script-type" content="text/javascript">
<meta name="description" content="日本最大級のポータルサイト。検索、オークション、ニュース、メール、コミュニティ、ショッピング、など80以上のサービスを展開。あなたの生活をより豊かにする「ライフ・エンジン」を目指していきます。">

ということで、

長くなったので続く。
curlGuzzleHTMLHTTPHTTPSPHPPSRPSR-7スクレイピング

kaneko tomo   kaneko tomo   2017年8月7日


関連記事

Laravel4でmeta情報を編集

複数コントローラーで同一viewを指定している場合に オンコーディングだとmet…

Pythonの環境構築

ご無沙汰しておりました。 ここe2infoでは傭兵としてLaravel5によるP…

Excelで印刷するときに全シートにプリンタ設定を反映させる方法のページを見つけました

Excelで全シートを選択して両面印刷にしても最初のシートしか両面印刷してもらえ…


← 前の投稿

次の投稿 →