PHP:curlでPOSTする

こんにちは、さるまりんです。

前回file_get_contents()でPOSTする方法について書かせてもらいました。

今回はcurlを使った方法です。

curlでPOSTする

curlを使ってサーバーにデータをPOSTするには以下のようにします。

$url = '送り先URL';
$data = [];

// $dataに送るデータを詰めます。
$data['name'] = 'salumarine';
$data['type'] = 'monkey';

// 送信データをURLエンコード
$data = http_build_query($data, "", "&");

// curlを初期化
$ch = curl_init();

// 設定!
curl_setopt($ch, CURLOPT_URL, $url); // 送り先
curl_setopt($ch, CURLOPT_POST, true); // POSTです
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // 送信データ
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 実行結果取得の設定

// 実行!
$output = curl_exec($ch);

// リソースを閉じる
curl_close($ch);

コードを簡単に説明しますね。

$urlは送信先のURLです。$dataの配列に送信するデータを詰めます。
そしてhttp_build_query()で送信データをURLエンコード。
ここまではfile_get_contents()を用いた時と同じです。

ここからcurlを使います。

流れは
curl_init()で初期化

curl_setopt()でURLやオプションを設定
curl_exec()で実行
curl_close()でリソースを閉じ終了
です。

curl_setopt()では、順番にCURLOPT_URLで送信先URLを、CURLOPT_POSTで「POSTします」ということを、CURLOPT_POSTFIELDSで送信データを。CURLOPT_RETURNTRANSFERにはtrueを設定し実行結果を文字列で取得します。

他にもたくさんのオプションがあり、例えばCURLOPT_SSL_VERIFYPEERfalseを設定すると、実行時にcurlはサーバ証明書の検証を行いません。オレオレ証明書を用いるサーバーへアクセスする際はそのようにします。
たくさんのオプションが存在するのでそちらはぜひ本家のcurl_setopt()のページを参照してみてください。

curl_setopt()の代わりにcurl_setopt_array()で配列を使って複数のオプションを設定することもできます。

上のコードは次のように書くことができます。

$options = [
    CURLOPT_URL => $url,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $data,
    CURLOPT_RETURNTRANSFER => true];

curl_setopt_array($ch, $options);

たくさん設定するオプションがあるときはこちらの方がシンプルに見えるかな。

file_get_contents()curl、違いは?

file_get_contents()curlを使う方法はどう違うの?となりますよね。curlの方は上にもあったようにたくさんの設定をcurl_setopt()で簡単に指定することができます。タイムアウトのCURLOPT_TIMEOUTで設定するだけです。細やかなのです。

なので簡単なケースではfile_get_contents()でいいかと思いますが、curlを使うことの方が多いように思います。

他にも違いはたくさんあるかもしれないですがこの点が一番大きいかなと。

一つのことをするのにいろんな方法があります。プログラミングって言語や文化なんだなあと思います。そんな大げさなことではないのかもしれないですが。

日々勉強ですね。良い方法や美しい書き方を目指して頑張ります。

おかしなところとかよかったら指摘してもらえると嬉しいです。どうぞよろしくお願いします。

読んでくださってありがとうございます。

ではまた!