【PHP】cURL関数の使用方法
こんにちは、みよしやです。
今回は、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関数を使用してみてはいかがでしょうか?