PHP cURLのスニペット集

このページは、PHPのcURL関数のスニペットなどをまとめる予定のページです。

目次

注意

  • コードのライセンスは CC0 (クレジット表示不要、改変可、商用可) です。

スニペット

cURL

GETリクエスト

$url = 'https://example.com/?key=value'; // リクエスト先のURL

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url); // URL
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl_exec() 経由で応答データを直接取得できるようにする
curl_setopt($curl, CURLOPT_TIMEOUT, 10); // 実行タイムアウトの秒数
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); // 接続タイムアウトの秒数
$body = curl_exec($curl); // レスポンスボディ取得 (失敗した場合false)
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); // レスポンスコード
$errno = curl_errno($curl); // エラーコード
$error = curl_error($curl); // エラー文字列
curl_close($curl);

//$json = ($body !== false) ? json_decode($body, true) : false; // レスポンスボディがJSONのときに使用します

POSTリクエスト

application/x-www-form-urlencoded
$url = 'https://example.com'; // リクエスト先のURL
$data = array( // パラメータ
    'key' => 'value',
);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url); // URL
curl_setopt($curl, CURLOPT_POST, true); // POST送信
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data, '', '&', PHP_QUERY_RFC3986)); // 送信データをセット (文字列化する)
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl_exec() 経由で応答データを直接取得できるようにする
curl_setopt($curl, CURLOPT_TIMEOUT, 10); // 実行タイムアウトの秒数
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); // 接続タイムアウトの秒数
$body = curl_exec($curl); // レスポンスボディ取得 (失敗した場合false)
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); // レスポンスコード
$errno = curl_errno($curl); // エラーコード
$error = curl_error($curl); // エラー文字列
curl_close($curl);
multipart/form-data
$url = 'https://example.com'; // リクエスト先のURL
$data = array( // パラメータ
    'key' => 'value',
    'file1' => new CURLFile('/path/to/file.png', 'image/png', 'file.png') // ファイル
);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url); // URL
curl_setopt($curl, CURLOPT_POST, true); // POST送信
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // 送信データをセット (連想配列)
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl_exec() 経由で応答データを直接取得できるようにする
curl_setopt($curl, CURLOPT_TIMEOUT, 10); // 実行タイムアウトの秒数
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); // 接続タイムアウトの秒数
$body = curl_exec($curl); // レスポンスボディ取得 (失敗した場合false)
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); // レスポンスコード
$errno = curl_errno($curl); // エラーコード
$error = curl_error($curl); // エラー文字列
curl_close($curl);
application/json
$url = 'https://example.com'; // リクエスト先のURL
$data = array( // パラメータ
    'key' => 'value',
);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url); // URL
curl_setopt($curl, CURLOPT_POST, true); // POSTリクエスト
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); // ヘッダー
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); // 送信データをセット (JSONエンコードする)
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl_exec() 経由で応答データを直接取得できるようにする
curl_setopt($curl, CURLOPT_TIMEOUT, 10); // 実行タイムアウトの秒数
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); // 接続タイムアウトの秒数
$body = curl_exec($curl); // レスポンスボディ取得 (失敗した場合false)
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); // レスポンスコード
$errno = curl_errno($curl); // エラーコード
$error = curl_error($curl); // エラー文字列
curl_close($curl);

HEADリクエスト

$url = 'https://example.com/?key=value'; // リクエスト先のURL

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url); // URL
curl_setopt($curl, CURLOPT_NOBODY, true); // HEADリクエスト
curl_setopt($curl, CURLOPT_HEADER, true); // ヘッダーの内容を出力
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl_exec() 経由で応答データを直接取得できるようにする
curl_setopt($curl, CURLOPT_TIMEOUT, 10); // 実行タイムアウトの秒数
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); // 接続タイムアウトの秒数
$header = curl_exec($curl); // レスポンスヘッダー取得 (失敗した場合false)
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); // レスポンスコード
$errno = curl_errno($curl); // エラーコード
$error = curl_error($curl); // エラー文字列
curl_close($curl);

PUTリクエスト

application/json
$url = 'https://example.com'; // リクエスト先のURL
$data = array( // パラメータ
    'key' => 'value',
);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url); // URL
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT'); // PUTリクエスト
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); // ヘッダー
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); // 送信データをセット (JSONエンコードする)
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl_exec() 経由で応答データを直接取得できるようにする
curl_setopt($curl, CURLOPT_TIMEOUT, 10); // 実行タイムアウトの秒数
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); // 接続タイムアウトの秒数
$body = curl_exec($curl); // レスポンスボディ取得 (失敗した場合false)
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); // レスポンスコード
$errno = curl_errno($curl); // エラーコード
$error = curl_error($curl); // エラー文字列
curl_close($curl);

DELETEリクエスト

application/json
$url = 'https://example.com'; // リクエスト先のURL
$data = array( // パラメータ
    'key' => 'value',
);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url); // URL
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE'); // DELETEリクエスト
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); // ヘッダー
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); // 送信データをセット (JSONエンコードする)
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl_exec() 経由で応答データを直接取得できるようにする
curl_setopt($curl, CURLOPT_TIMEOUT, 10); // 実行タイムアウトの秒数
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); // 接続タイムアウトの秒数
$body = curl_exec($curl); // レスポンスボディ取得 (失敗した場合false)
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); // レスポンスコード
$errno = curl_errno($curl); // エラーコード
$error = curl_error($curl); // エラー文字列
curl_close($curl);

オプション

curl_setopt_array で一括指定もできます。

SSL証明書検証をしない
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // SSL証明書検証をしない
curl_exec() 経由で応答データを直接取得できるようにする
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl_exec() 経由で応答データを直接取得できるようにする
タイムアウト
curl_setopt($curl, CURLOPT_TIMEOUT, 10); // 実行タイムアウトの秒数
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); // 接続タイムアウトの秒数
リファラー
curl_setopt($curl, CURLOPT_REFERER, 'https://example.com'); // リファラー
リダイレクトをたどる
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // リダイレクトをたどる
リクエストヘッダー
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); // リクエストヘッダー
ユーザーエージェント
curl_setopt($curl, CURLOPT_USERAGENT, 'Test UA'); // ユーザーエージェント
HTTP/1.1
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); // HTTP/1.1
HTTP/2
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); // HTTP/2

レスポンスヘッダー取得

CURLOPT_HEADERFUNCTION 経由で配列で取得 (curl_exec()の前に設定)
// レスポンスヘッダー取得 (['HTTP/1.1 200 OK', 'Date: ...', ...])
$headers = array();
curl_setopt($curl, CURLOPT_HEADERFUNCTION, function($curl, $header) use (&$headers) {
    if (trim($header) !== '') $headers[] = trim($header);
    return strlen($header);
});
CURLOPT_HEADERFUNCTION 経由で連想配列で取得 (curl_exec()の前に設定)
// レスポンスヘッダー取得 (['Date' => ['...'], 'Content-Type' => ['text/html'], ...])
$headers = array();
curl_setopt($curl, CURLOPT_HEADERFUNCTION, function($curl, $header) use (&$headers) {
    if (trim($header) !== '') {
        $pair = explode(':', $header, 2);
        if (count($pair) == 2) {
            $headers[trim($pair[0])][] = trim($pair[1]);
        }
    }
    return strlen($header);
});
CURLOPT_HEADERでヘッダーをレスポンスに含めてCURLINFO_HEADER_SIZEでヘッダーとボディを分割
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url); // URL
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl_exec() 経由で応答データを直接取得できるようにする
curl_setopt($curl, CURLOPT_HEADER, true); // ヘッダーを出力
curl_setopt($curl, CURLOPT_TIMEOUT, 10); // 実行タイムアウトの秒数
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); // 接続タイムアウトの秒数
$response = curl_exec($curl); // レスポンス取得 (失敗した場合false)
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); // レスポンスコード
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE); // ヘッダーサイズ
$errno = curl_errno($curl); // エラーコード
$error = curl_error($curl); // エラー文字列
curl_close($curl);

if ($response !== false) {
    $header = trim(substr($response, 0, $headerSize)); // ヘッダー
    $headerArray = explode("\r\n", $header); // ヘッダー (行ごとに分割)
    $body = substr($response, $headerSize); // ボディ
}