Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】CURLOPT_NOBODY定数の使い方

CURLOPT_NOBODY定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

CURLOPT_NOBODY定数は、PHPのcURL拡張機能において、HTTPリクエストの際にレスポンスボディを受信しないことを指示するための定数です。この定数にtrueを設定してcurl_setopt()関数で使用すると、クライアントはWebサーバーに対してコンテンツ本体を要求せず、ヘッダ情報のみを送信するように指示するHTTP HEADリクエストを生成します。

通常、Webサーバーからの応答は、リクエストに関するメタ情報である「ヘッダ」と、実際のコンテンツデータである「ボディ」で構成されますが、CURLOPT_NOBODYを有効にすることで、ボディ部分のデータ転送を完全に省略できます。

この機能は、Webリソースの存在確認、リンク切れのチェック、ファイルの最終更新日やサイズといったメタデータのみの取得に非常に有用です。例えば、特定のURLにアクセス可能かを確認したい場合や、画像ファイルのサイズをダウンロード前に知りたい場合などに、実際のコンテンツをダウンロードすることなく必要な情報を効率的に取得できます。これにより、特に多数のURLを処理する際や、ネットワーク帯域幅の節約が重要な場面で、アプリケーションのパフォーマンス向上に貢献します。

構文(syntax)

1<?php
2$ch = curl_init("http://example.com");
3curl_setopt($ch, CURLOPT_NOBODY, true);
4curl_exec($ch);
5curl_close($ch);
6?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP cURL CURLOPT_NOBODYでボディをスキップする

1<?php
2
3/**
4 * CURLOPT_NOBODY を使用して指定されたURLのボディをスキップするサンプル関数。
5 *
6 * この関数はHTTPリクエストを送信しますが、CURLOPT_NOBODY を設定することで、
7 * サーバーから返されるレスポンスボディは取得しません。
8 * 主にリソースの存在確認や、HTTPヘッダー情報のみを効率的に取得したい場合(CURLOPT_HEADERと併用)に使用されます。
9 *
10 * @param string $url 取得するURL
11 * @return bool リクエストが成功し、ボディがスキップされた場合はtrue、それ以外はfalse
12 */
13function checkUrlWithoutBody(string $url): bool
14{
15    // cURLセッションを初期化
16    $ch = curl_init();
17
18    if ($ch === false) {
19        echo "エラー: cURLセッションの初期化に失敗しました。\n";
20        return false;
21    }
22
23    // 取得するURLを設定
24    curl_setopt($ch, CURLOPT_URL, $url);
25
26    // CURLOPT_NOBODY を true に設定することで、HTTPボディは取得されません。
27    // これにより、データ転送量を減らし、高速にリクエストのステータスを確認できます。
28    curl_setopt($ch, CURLOPT_NOBODY, true);
29
30    // curl_exec() の結果を文字列として返すように設定します。
31    // CURLOPT_NOBODY が true の場合、ボディがないため返される文字列は通常空になります。
32    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
33
34    // cURLセッションを実行
35    $response = curl_exec($ch);
36
37    if ($response === false) {
38        // cURL実行中にエラーが発生した場合
39        echo "エラー: cURLリクエストの実行に失敗しました。\n";
40        echo "cURLエラー: " . curl_error($ch) . "\n";
41        curl_close($ch);
42        return false;
43    }
44
45    // HTTPステータスコードを取得
46    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
47
48    // cURLセッションを閉じる
49    curl_close($ch);
50
51    echo "--- リクエスト結果 --- \n";
52    echo "対象URL: " . $url . "\n";
53    echo "HTTPステータスコード: " . $httpCode . "\n";
54    echo "curl_exec() の返り値の長さ(ボディの有無): " . strlen($response) . "バイト\n";
55
56    // HTTPステータスコードが200番台(成功)かつ、返り値の長さが0であれば、
57    // ボディが正常にスキップされたと判断できます。
58    if ($httpCode >= 200 && $httpCode < 300 && strlen($response) === 0) {
59        echo "メッセージ: CURLOPT_NOBODY が効果的に機能し、ボディは取得されませんでした。\n";
60        return true;
61    } elseif ($httpCode >= 200 && $httpCode < 300) {
62        echo "警告: HTTPリクエストは成功しましたが、curl_exec() の返り値が空ではありませんでした。"
63             . "CURLOPT_NOBODY の設定、またはサーバーの応答を確認してください。\n";
64        return false;
65    } else {
66        echo "エラー: リクエストが失敗しました。HTTPステータスコード: " . $httpCode . "\n";
67        return false;
68    }
69}
70
71// サンプルとしてチェックするURL
72$targetUrl = "https://www.example.com"; // 実際のWebサイトのURLに置き換えてお試しください
73
74// 関数を実行
75$success = checkUrlWithoutBody($targetUrl);
76
77if ($success) {
78    echo "\n✔ URLのチェックが成功しました(ボディなし)。\n";
79} else {
80    echo "\n✖ URLのチェックに失敗しました。\n";
81}
82
83?>

PHPのCURLOPT_NOBODYは、cURL拡張機能でHTTPリクエストを送信する際に使用される定数の一つです。この定数をtrueに設定すると、指定されたURLへのリクエストは行われますが、サーバーから返されるレスポンスのボディ部分を一切取得せずに、ヘッダー情報のみを受け取ります。これにより、データ転送量を大幅に削減し、特に大きなファイルや複雑なページの内容を読み込むことなく、ウェブサイトの存在確認やHTTPステータスコードのみを効率的に取得したい場合に役立ちます。

サンプルコードのcheckUrlWithoutBody関数では、まずcurl_init()でcURLセッションを開始し、curl_setopt()を使って各種設定を行っています。ここでCURLOPT_NOBODYtrueに設定することで、サーバーからボディデータが転送されないように指示しています。また、CURLOPT_RETURNTRANSFERtrueに設定することで、curl_exec()の実行結果を文字列として受け取れるようにしていますが、CURLOPT_NOBODYが有効な場合、この文字列は通常空になります。

関数は最終的にcurl_getinfo()で取得したHTTPステータスコードが200番台であり、かつボディが空であることを確認して、リクエストが成功したと判断しtrueを返します。CURLOPT_NOBODY自体には引数や戻り値はありませんが、この関数では引数としてチェックする$urlを受け取り、リクエストの成功・失敗をbool値で返します。このようにCURLOPT_NOBODYを利用することで、ウェブリソースへの軽量なアクセスが可能になります。

CURLOPT_NOBODYは、HTTPリクエストでサーバーからのレスポンスボディを取得しないよう指示するオプションです。これにより、データ転送量を削減し、URLの存在確認やHTTPステータスコード、ヘッダー情報のみを効率的に取得できます。ボディがスキップされるため、curl_exec()の返り値は通常空文字列となります。もし空でなければ、サーバーの応答や設定を確認してください。

サンプルコードのように、curl_init()の成否確認やcurl_exec()実行後のエラーハンドリングは必ず行いましょう。また、処理の最後にはcurl_close()でリソースを解放することがプログラムの安定性を保つ上で非常に重要です。このオプションは、Webサイトの健全性チェックや、大きなファイルをダウンロードせずにメタ情報だけ知りたい場合などに役立ちます。

関連コンテンツ