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

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

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

作成日: 更新日:

基本的な使い方

CURLOPT_RANGE定数は、PHPのcURL拡張機能において、HTTPリクエストのRangeヘッダを設定するためのオプションを表す定数です。この定数を使用することで、Webサーバーに対してリソース(ファイルなど)の全体ではなく、指定された特定の部分のみを要求することが可能になります。例えば、大きなファイルのダウンロードを途中から再開する「レジューム機能」や、動画ファイルのシーク(再生位置の移動)機能などを実装する際に利用されます。

具体的には、curl_setopt()関数にこのCURLOPT_RANGE定数を第一引数として指定し、第二引数には取得したいバイト範囲を示す文字列を渡します。この文字列はHTTPのRangeヘッダの形式に従い、「0-499」のように開始バイトと終了バイトを指定したり、「500-」のように開始バイトから最後までを指定したり、「-100」のように最後の100バイトを指定したりすることができます。

このオプションを設定してcURLリクエストを実行すると、サーバーは通常、指定された範囲のデータと、その範囲を示すContent-Rangeヘッダを含む部分的なレスポンスを返します。ただし、WebサーバーがRangeリクエストをサポートしていない場合や、リクエストされた範囲が無効な場合には、サーバーは異なる挙動を示すことがありますので、その点には注意が必要です。システムエンジニアを目指す上で、効率的なデータ転送や信頼性の高いファイルダウンロード機能を構築する際に重要な定数の一つです。

構文(syntax)

1<?php
2$ch = curl_init("http://example.com/data.txt");
3curl_setopt($ch, CURLOPT_RANGE, "0-1023");
4?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP cURLで範囲指定ダウンロードする

1<?php
2
3/**
4 * cURLを使用して指定されたURLから特定のバイト範囲のコンテンツをダウンロードします。
5 * CURLOPT_RANGE オプションの使用方法を示します。
6 *
7 * @param string $url ダウンロード対象のファイルのURL。
8 * @param string $range ダウンロードするバイト範囲。例: "0-99" (最初の100バイト), "100-" (100バイト目以降), "-50" (最後の50バイト)。
9 * @return string|false ダウンロードしたコンテンツ、またはエラーが発生した場合は false。
10 */
11function downloadFileRange(string $url, string $range): string|false
12{
13    // cURLセッションを初期化します。
14    $ch = curl_init();
15
16    // cURL初期化に失敗した場合のエラーハンドリング。
17    if ($ch === false) {
18        echo "エラー: cURLセッションの初期化に失敗しました。\n";
19        return false;
20    }
21
22    // ダウンロードするファイルのURLを設定します。
23    curl_setopt($ch, CURLOPT_URL, $url);
24
25    // ダウンロードするバイト範囲を設定します。
26    // このオプションは、HTTPリクエストにRangeヘッダを追加し、
27    // サーバから指定された範囲のデータのみを取得するよう要求します。
28    curl_setopt($ch, CURLOPT_RANGE, $range);
29
30    // curl_exec() の戻り値を文字列として取得するように設定します。
31    // このオプションを true にすると、結果が直接出力されず、変数に格納されます。
32    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
33
34    // cURLリクエストを実行し、結果を取得します。
35    $response = curl_exec($ch);
36
37    // cURL実行中にエラーが発生したかチェックします。
38    if (curl_errno($ch)) {
39        echo "cURLエラー (コード: " . curl_errno($ch) . "): " . curl_error($ch) . "\n";
40        // エラーが発生した場合は、cURLセッションを閉じて false を返します。
41        curl_close($ch);
42        return false;
43    }
44
45    // cURLセッションを閉じ、関連するリソースを解放します。
46    curl_close($ch);
47
48    return $response;
49}
50
51// --- 使用例 ---
52// 注意: 以下の 'http://example.com/some_file.txt' は実際の有効なURLに置き換えてください。
53// バイト範囲指定をテストするためには、アクセス可能な大きなファイルへのURLが適しています。
54$targetUrl = 'http://example.com/some_file.txt';
55
56// 例1: 最初の100バイトを取得する
57$range1 = '0-99';
58echo "--- URL: {$targetUrl}, 範囲: {$range1} をダウンロード中 ---\n";
59$content1 = downloadFileRange($targetUrl, $range1);
60if ($content1 !== false) {
61    echo "取得したバイト数: " . strlen($content1) . " バイト\n";
62    echo "取得したコンテンツの冒頭(最大50文字):\n";
63    echo substr($content1, 0, 50) . "...\n\n";
64} else {
65    echo "ダウンロードに失敗しました。\n\n";
66}
67
68// 例2: 100バイト目から200バイト目までを取得する
69$range2 = '100-199';
70echo "--- URL: {$targetUrl}, 範囲: {$range2} をダウンロード中 ---\n";
71$content2 = downloadFileRange($targetUrl, $range2);
72if ($content2 !== false) {
73    echo "取得したバイト数: " . strlen($content2) . " バイト\n";
74    echo "取得したコンテンツの冒頭(最大50文字):\n";
75    echo substr($content2, 0, 50) . "...\n\n";
76} else {
77    echo "ダウンロードに失敗しました。\n\n";
78}
79
80// 例3: 最後の50バイトを取得する (サーバーがRangeリクエストに適切に対応している必要があります)
81$range3 = '-50';
82echo "--- URL: {$targetUrl}, 範囲: {$range3} をダウンロード中 ---\n";
83$content3 = downloadFileRange($targetUrl, $range3);
84if ($content3 !== false) {
85    echo "取得したバイト数: " . strlen($content3) . " バイト\n";
86    echo "取得したコンテンツの冒頭(最大50文字):\n";
87    echo substr($content3, 0, 50) . "...\n\n";
88} else {
89    echo "ダウンロードに失敗しました。\n\n";
90}
91
92?>

このPHPサンプルコードは、cURLライブラリを用いて、ウェブ上のファイルから特定のバイト範囲のコンテンツのみをダウンロードする方法を説明しています。CURLOPT_RANGEは、HTTPリクエストにおいて取得するデータの範囲を指定するために使用されるcURLオプションです。

downloadFileRange関数は、ダウンロード対象のURLと、"0-99"(最初の100バイト)や"100-"(100バイト目以降)のような形式で指定するバイト範囲を引数として受け取ります。関数内では、まずcurl_init()でcURLセッションを開始し、CURLOPT_URLで目的のURLを設定します。次に、curl_setopt($ch, CURLOPT_RANGE, $range);という記述で、サーバーに送るリクエストヘッダにRange情報を追加し、指定された範囲のデータのみを要求します。CURLOPT_RETURNTRANSFERをtrueに設定することで、curl_exec()が実行結果を文字列として返すようにし、コンテンツを直接出力せず変数に格納できるようにしています。処理が完了したら、curl_close()でリソースを解放します。

この関数は、ダウンロードが成功した場合には取得したコンテンツの文字列を返します。何らかのエラーが発生した場合はfalseを返し、その際にはエラーメッセージが出力されます。コードの下部にある使用例では、異なるバイト範囲(最初の100バイト、中間の一部、最後の50バイト)を指定してファイルをダウンロードする具体的なケースが示されており、CURLOPT_RANGEの柔軟な使い方を理解するのに役立ちます。これにより、ファイル全体をダウンロードせずに必要な部分だけを取得する効率的な処理が実現できます。

このコードを実行するには、PHPのcURL拡張が有効になっている必要があります。CURLOPT_RANGEは、サーバーがHTTPのRangeリクエストに対応している場合にのみ意図通りに機能しますので、対象サーバーの仕様を事前に確認してください。サンプル内のhttp://example.com/some_file.txtはテスト用のURLですので、実際にアクセス可能な大きなファイルを示すURLに必ず置き換えてください。バイト範囲の指定形式(例: "0-99", "100-", "-50")を正しく理解して使用することが重要です。また、curl_init()が失敗した場合や、curl_exec()でエラーが発生した場合に備え、適切なエラーハンドリングとcurl_close()によるリソースの解放を忘れないようにしてください。

CURLOPT_RANGEで特定範囲のWebコンテンツを取得する

1<?php
2
3/**
4 * CURLOPT_RANGE を使用して、指定された URL から特定のバイト範囲のコンテンツをダウンロードします。
5 *
6 * CURLOPT_RANGE オプションは、cURL リクエストでダウンロードするデータのバイト範囲を指定します。
7 * 例えば、'0-100' は最初の 101 バイトを、'100-' は 100 バイト目以降のすべてを、
8 * '-50' はコンテンツの最後の 50 バイトを取得します。
9 *
10 * @param string $url ダウンロード対象の URL
11 * @param string $range ダウンロードするバイト範囲 (例: '0-200', '500-', '-100')
12 * @return string|false ダウンロードしたコンテンツの指定された範囲、またはエラー発生時は false
13 */
14function getPartialWebContent(string $url, string $range): string|false
15{
16    // cURL セッションを初期化します。
17    $ch = curl_init();
18
19    if ($ch === false) {
20        // cURL 初期化に失敗した場合
21        error_log('cURL セッションの初期化に失敗しました。');
22        return false;
23    }
24
25    // ダウンロード対象の URL を設定します。
26    curl_setopt($ch, CURLOPT_URL, $url);
27    // レスポンスを文字列として返すように設定します。
28    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
29    // ダウンロードするバイト範囲を指定します。
30    curl_setopt($ch, CURLOPT_RANGE, $range);
31
32    // cURL セッションを実行し、結果を取得します。
33    $content = curl_exec($ch);
34
35    // エラーが発生したか確認します。
36    if (curl_errno($ch)) {
37        $error_msg = curl_error($ch);
38        error_log("cURL エラー: {$error_msg}");
39        $content = false; // エラー時は false を返す
40    }
41
42    // cURL セッションを閉じます。
43    curl_close($ch);
44
45    return $content;
46}
47
48// --- コードの実行例 ---
49// 実際には、公開されている小さなテキストファイルなどのURLに置き換えてください。
50// 例として、Googleのトップページの一部を取得してみます。
51$targetUrl = 'https://www.google.com';
52$byteRange = '0-200'; // 最初の 201 バイト (0 から 200 まで) を取得
53
54echo "対象URL: {$targetUrl}\n";
55echo "取得範囲: {$byteRange}\n";
56echo "----------------------------------------\n";
57
58$partialContent = getPartialWebContent($targetUrl, $byteRange);
59
60if ($partialContent !== false) {
61    echo "ダウンロードされたコンテンツの範囲 ({$byteRange} バイト):\n";
62    echo $partialContent;
63    echo "\n----------------------------------------\n";
64    echo "取得されたバイト数: " . mb_strlen($partialContent, '8bit') . " バイト\n";
65} else {
66    echo "コンテンツのダウンロードに失敗しました。\n";
67}
68
69?>

PHPのCURLOPT_RANGEは、HTTPプロトコルが提供する「範囲リクエスト」という機能を利用し、ウェブ上のコンテンツの一部のみをダウンロードする際に使用する定数です。これは、大きなファイルの一部だけを効率的に取得したい場合や、途中で途切れたダウンロードを再開したい場合などに非常に役立ちます。

この定数は、cURLリクエストの設定を行うcurl_setopt()関数と共に使用されます。具体的には、curl_setopt()の第2引数にCURLOPT_RANGEを指定し、第3引数にはダウンロードしたいデータのバイト範囲を文字列で渡します。例えば、「'0-200'」と指定すると最初の0バイト目から200バイト目まで(合計201バイト)を取得します。「'500-'」とすると500バイト目以降のすべてのデータを、「'-100'」とするとコンテンツの最後の100バイトを取得できます。

サンプルコードのgetPartialWebContent関数は、指定されたURLから、このCURLOPT_RANGEオプションを用いて特定のバイト範囲のコンテンツをダウンロードします。引数$urlにはダウンロード対象のウェブページやファイルのURLを、$rangeには取得したいバイト範囲を「'開始-終了'」や「'開始-'」、「'-終了'」といった形式の文字列で渡します。処理が成功すると、ダウンロードされたコンテンツの指定範囲が文字列として返され、何らかのエラーが発生した場合にはfalseが戻り値として返されます。これにより、必要なデータだけを効率的に取得し、ネットワーク負荷や処理時間を削減することが可能になります。

このサンプルコードは、HTTPリクエストで特定のバイト範囲のコンテンツを取得するCURLOPT_RANGEオプションの利用法を示しています。初心者は、テストに利用するURLがレンジリクエストに対応しているか、またサーバーに過度な負荷をかけないか注意が必要です。サーバーがレンジリクエストに対応していない場合、意図しない全コンテンツが返されたり、エラーになったりする可能性があります。バイト範囲の指定は0から始まるため、'0-200'は最初の201バイトを意味することを理解してください。エラー発生時のcurl_errnoやcurl_errorによる詳細な確認と、curl_closeによるリソースの解放は、安全なコードのために非常に重要です。このオプションは、大容量ファイルの部分的な取得やダウンロード再開などに役立ちますが、取得したコンテンツの文字エンコーディングにも留意してください。

関連コンテンツ

関連IT用語

関連プログラミング言語