PHPコードだけでデータを取得したり送信したりするのに便利なcURL。
コンテンツ取得だけでしたらfile_get_contents
も使えますが、非同期処理を行えるためcURLの方が通信速度が早いようです。
この記事ではcURLをあまり使ったことが無い人向けに
- cURLの基本的な使い方
- cURLのよく使うオプション
- cURLの具体的な通信内容(エラーなど)を確認する方法
について丁寧にまとめました。
HTTPリクエストを扱うcURLとは
cURL(カール)とはHTTPリクエストを扱えるPHPのライブラリです。
要はブラウザを経由しなくてもPHPのコードでデータの送信・取得が行えるというスグレモノ。
Twitter APIなどの各種クラウドAPIとの連携にもかなり活躍します。
できることが多いゆえに、一見複雑に見えますが行っていることはシンプルです。
- curlセッションを開始する
- 通信時のオプションを設定する
- データを送信もしくは受信する
- curlセッションを終了する
という4段階で利用できます。
例えば、このGoogleのページデータを取得するコードは以下です。
//curlセッションを開始する
$ch = curl_init();
//通信時のオプションを設定する
curl_setopt($ch, CURLOPT_URL, "http://www.google.com/");
//データを送信もしくは受信する
$data = curl_exec($ch);
//curlセッションを終了する
curl_close($ch);
//取得したデータをHTML出力
echo htmlspecialchars($data);
もともとのHTMLソースにて相対パスで指定されている画像などが読み込みエラーとなっていますが、ページのコンテンツ自体は取得できました。
もっと詳しく使い方を見ていきましょう。
cURLの基本動作まとめ
cURLを使うときに、必ず必要になるのは以下。
//curlセッションを開始する
$ch = curl_init();
//オプション指定
curl_setopt($ch, xxxx, xxxxx);
//データを送信もしくは受信する
$data = curl_exec($ch);
//curlセッションを終了する
curl_close($ch);
curl_init
で開始。
通信内容をcurl_setopt
で指定したあとcurl_exec
で送受信し、curl_close
で終了します。
この流れはどんな通信内容でも基本的に変わらないので、しっかり抑えておきましょう。
uURLのオプションまとめ
通信時に指定できる各オプションは下記の形で指定します。
curl_setopt(セッション, 項目名, 設定値);
今回の例ではcurl_init
で用意したセッションは$ch
ですので、より具体的には下記の形になりますね。
curl_setopt($ch, 項目名, 設定値);
cURLを実行するときに複数のオプションを指定したい場合は併記OK。
オプションは全部で100個以上あるのですべてをご紹介することは難しいですが、よく使うものをまとめていきます。
全オプションを確認したい人は、下記の公式ページを参照するのが確実です。
https://www.php.net/manual/ja/function.curl-setopt.php
CURLOPT_URL
curl_setopt($ch, CURLOPT_URL, "http://www.google.com/");
取得するURLを指定します。
CURLOPT_RETURNTRANSFER
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
true
を指定することで、curl_exec()
実行の結果を文字列として受け取れるようになります。
データの取得をしたいときに設定するオプションですね。
同様のオプションとしてCURLOPT_MUTE
がありましたが、すでに削除されて使えないので注意してください
CURLOPT_POST
curl_setopt($ch, CURLOPT_POST, true);
true
で設定することで、POSTで通信を行うようになります。
CURLOPT_POSTFIELDS
$data = ['a' => 1, 'b' => 2];
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$data = ['a' => 1, 'b' => 2];
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data, '', '&'));
POSTにて通信するデータを設定できます。
後者の例では、http_build_query
というURLパラメータを生成する関数を利用して文字列の形式でデータを渡しています。
渡すデータ$data
が配列か文字列かで挙動が変わるので注意してください。
参考:https://qiita.com/nowmura/items/f2ce88a8f52a057489fa
CURLOPT_CONNECTTIMEOUT
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
接続の試行をどれくらい待ってタイムアウトにするかを設定しています。
今回の例では30秒で指定しました。
0
を指定するとタイムアウトはなくなります。
CURLOPT_HTTPHEADER
$header = [
'Content-Type:application/json',
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
通信時のHTTPヘッダーを設定できます。
ヘッダーは連想配列ではなくキー:値
の形にするよう注意してください。
CURLOPT_SSL_VERIFYPEER
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
通常の通信ではサーバー証明書の検証を行ってから通信しますが、通信時に検証をしたくないときにfalse
で設定します。
cURLのオプションをまとめて指定する方法
cURLのオプションは複数指定したい場合、順不同で併記すればOKです。
curl_setopt($ch, CURLOPT_URL, "http://www.google.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
ただし設定する項目が多い場合には配列でまとめて記述することもできます。
$options = [
CURLOPT_URL => "http://www.google.com/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 30
];
curl_setopt_array($ch, $options);
curl_setopt_array
でまとめて設定可能です。
cURLの具体的な通信内容を確認する方法
cURLの通信に際し、自分がどんなオプションを設定したのか、また通信時に発生したエラーはあるかも簡単に確認できます。
設定したオプションをまとめて確認する方法
cURLを実行した際、実際にどういう通信内容・結果となるよう設定したオプションを確認するにはcurl_getinfo
が便利です。
$info = curl_getinfo($ch);
curl_setopt
で各オプションを設定したあと、かつcurl_close
でセッションを終了する前に記述してください。
$info
には次のような内容が収められています。
array(30) {
["url"]=>
string(22) "http://www.google.com/"
["content_type"]=>
string(29) "text/html; charset=ISO-8859-1"
["http_code"]=>
int(200)
["header_size"]=>
int(732)
["request_size"]=>
int(53)
["filetime"]=>
int(-1)
["ssl_verify_result"]=>
int(0)
["redirect_count"]=>
int(0)
["total_time"]=>
float(0.439078)
["namelookup_time"]=>
float(0.007204)
["connect_time"]=>
float(0.279157)
["pretransfer_time"]=>
float(0.279256)
["size_upload"]=>
float(0)
["size_download"]=>
float(51179)
["speed_download"]=>
float(116580)
["speed_upload"]=>
float(0)
["download_content_length"]=>
float(-1)
["upload_content_length"]=>
float(-1)
["starttransfer_time"]=>
float(0.376624)
["redirect_time"]=>
float(0)
["redirect_url"]=>
string(0) ""
["primary_ip"]=>
string(14) "172.xxx.xx.xxx"
["certinfo"]=>
array(0) {
}
["primary_port"]=>
int(80)
["local_ip"]=>
string(12) "192.xxx.x.xx"
["local_port"]=>
int(16036)
["http_version"]=>
int(2)
["protocol"]=>
int(1)
["ssl_verifyresult"]=>
int(0)
["scheme"]=>
string(4) "HTTP"
}
発生したエラーを確認する方法
cURLを実行したところ思うような結果にならないこともあると思います。
原因を探るときにはエラーを確認してみるのが一番手っ取り早いです。
//エラー番号を取得
$error_no = curl_errno($ch);
//エラーを取得
$errors = curl_error($ch)
こちらもcurl_setopt
で各オプションを設定したあと、かつcurl_close
でセッションを終了する前に記述してください。
$error_no
には、正常に通信が終了したときには0
、エラーが発生したときには1〜88
の番号が返ってきます。
$errors
には発生したエラーの内容が入っています(正常なときは空です)。
たとえば、下記のようにURLを指定せずデータの送受信を行った場合はエラーとなります。
//curlセッションを開始する
$ch = curl_init();
//データを送信もしくは受信する
$data = curl_exec($ch);
//エラー番号を取得
$error_no = curl_errno($ch);
//エラーを取得
$errors = curl_error($ch);
//curlセッションを終了する
curl_close($ch);
echo 'ERROR NO: '.$error_no;
echo '<br>';
echo 'ERROR MSG :'.$errors;
上記の場合は下記のように出力されるはずです。
ERROR NO: 3
ERROR MSG: No URL set!
もしエラーが発生したときに挙動を変えたい場合は以下のようにすればOKです。
//curlセッションを開始する
$ch = curl_init();
//データを送信もしくは受信する
$data = curl_exec($ch);
//エラー番号を取得
$error_no = curl_errno($ch);
//エラーを取得
$errors = curl_error($ch);
//curlセッションを終了する
curl_close($ch);
//エラーがあるときにだけエラー内容を出力
if ($error_no !== 0) {
echo 'ERROR MSG: ' . $errors;
}
まとめ
cURLはオプションを組み合わせることで、お手軽に状況に応じた通信が可能です。
クラウドAPIなどとの連携もばっちり。
- curlセッションを開始する
- 通信時のオプションを設定する
- データを送信もしくは受信する
- curlセッションを終了する
という流れで利用できます。
cURLを利用すればPHPコードだけでサイトマップの更新をGoogleに通知することも可能ですので、ぜひいろいろと試してみてください。
コメント