【PHP】cURL関数の使用方法

#PHP
written by みよしや

こんにちは、みよしやです。

今回は、PHPのcURL関数を使用してHTTPリクエストを行う方法について書いていきます。

cURLとは

URLを指定してデータ転送を行う機能の総称で、
HTTP・HTTPS・FTP・SMTP・IMAPなど様々な通信プロトコルをサポートしています。

コマンドラインで”curlコマンド”を叩いてAPIの動作確認などを行うことはよくあると思いますが、今回はそのリクエストをPHPのcURL関数で実装していきます。

実装の基本的な流れ

簡単にcURL関数の説明していきます。

$curl = curl_init();

まず、curl_init()でcurlセッションの初期化を行います。

curl_setopt($curl, CURLOPT_URL, 'http://sample.com/');

次に、curlオプションを設定します。
ここではリクエスト先URLのみ設定しています。

curl_exec($curl);

curlを実行します。

curl_close($curl);

curlセッションを終了します。

ひとまずこれだけで、指定したURLのページ内容を取得して標準出力することができます。

 

$curl = curl_init('http://sample.com/');

ちなみに、上のように書くとセッション初期化と同時にURL指定も行うことができます。

$httpcode = curl_getinfo($curl, CURLINFO_RESPONSE_CODE);

必須ではありませんが、curl_getinfo()という関数で、転送に関する詳細情報も取得可能です。
上の例ではHTTPステータスコードを取得しています。

もう少し細かい設定が必要になる場合は、curlオプションを追加します。
次の章では使用頻度の高いオプション一覧をご紹介します。

 

curlオプション

CURLOPT_RETURNTRANSFER

curl_setopt($curl, CURLOPT_RETURNTRANSFER, [true/false]);

trueにすると返り値を文字列で返します。
変数に保存する方法場合はここをtrueに設定してください。

 

CURLOPT_POST

curl_setopt($curl, CURLOPT_POST, [true/false]);

POST送信する場合は、trueに設定します。
デフォルトはfalseになっているため、GETの場合は明記する必要はありません。

 

CURLOPT_POSTFIELDS

curl_setopt($curl, CURLOPT_POSTFIELDS, [送信するデータ]);

POST送信するデータを設定することができます。

 

CURLOPT_HTTPHEADER

curl_setopt($curl, CURLOPT_HTTPHEADER, [ヘッダー]);

ヘッダーを設定することができます。

 

サンプルコード

// セッション初期化
$curl = curl_init();

// URL指定
curl_setopt($curl, CURLOPT_URL, 'http://api/sample/');
// 返り値設定
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// ヘッダー設定
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
// メソッド指定
curl_setopt($curl, CURLOPT_POST, true);
// POSTデータ設定
$xml = '<?xml version="1.0" encoding="Shift_JIS" ?><test-request><test-id>001</test-id></test-request>';
curl_setopt($curl, CURLOPT_POSTFIELDS, $xml);

// curl実行
$result = curl_exec($curl);

// HTTPステータスコード取得
$httpcode = curl_getinfo($curl, CURLINFO_RESPONSE_CODE);

if($httpcode === 200){
     // リクエスト成功
     return $result;
} else {
     // リクエスト失敗
     return null;
}

 

最後に

file_get_contents関数を使用することでも同じようなHTTPリクエストを行うことができますが、
サーバーの設定によってはデータの取得ができない事例が多くあるようです。
そういった場合は、今回紹介したcURL関数を使用してみてはいかがでしょうか?