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

【PHP8.x】curl_copy_handle()関数の使い方

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

作成日: 更新日:

基本的な使い方

curl_copy_handle関数は、既存のcURLセッションハンドルを複製し、新しいcURLセッションハンドルを作成する関数です。この関数を利用することで、curl_init()で初期化し、curl_setopt()で設定したURL、HTTPヘッダ、タイムアウトなどの各種オプションをすべて引き継いだ、新しいハンドルを効率的に生成できます。例えば、同じ認証情報や接続設定を維持したまま、リクエスト先のURLや送信データだけを変更して複数のリクエストを実行したい場合に非常に役立ちます。これにより、毎回すべてのオプションを最初から設定し直す手間を省くことが可能です。複製されるのはオプション設定のみであり、既存の接続キャッシュなどのセッション固有の情報はコピーされません。そのため、複製されたハンドルは元のハンドルとは独立した、新しい接続として動作します。引数にはコピー元となるcURLハンドルを指定し、成功した場合は新しいcURLハンドルを、失敗した場合はfalseを返します。複製して作成したハンドルも、使用後はcurl_close()関数で閉じる必要があります。

構文(syntax)

1curl_copy_handle(CurlHandle $handle): CurlHandle|false

引数(parameters)

CurlHandle $handle

  • CurlHandle $handle: コピー元となる既存のcURLセッションハンドルを指定します。

戻り値(return)

CurlHandle|false

指定されたcURLハンドルから新しいハンドルのコピーを生成し、そのハンドルのインスタンスを返します。コピーに失敗した場合はfalseを返します。

サンプルコード

PHP cURLハンドルのコピーと再利用

1<?php
2
3// このスクリプトは、既存のcURLハンドルの設定をコピーし、
4// それを元に別のcURLリクエストを実行する方法を示します。
5// システムエンジニアを目指す初心者向けに、curl_copy_handle の基本的な使い方を解説します。
6
7/**
8 * cURLハンドルをコピーして異なるリクエストを実行する例
9 */
10function demonstrateCurlCopyHandle(): void
11{
12    echo "--- cURLハンドルコピーのデモンストレーションを開始 ---\n\n";
13
14    // 1. 最初のcURLハンドルを初期化します。
15    //    ここでは http://example.com へのGETリクエストを設定します。
16    $ch1 = curl_init("http://example.com");
17
18    // cURLハンドルの初期化に失敗した場合のチェック
19    if ($ch1 === false) {
20        echo "エラー: 最初のcURLハンドル (ch1) の初期化に失敗しました。\n";
21        return;
22    }
23
24    // オプションを設定します。
25    // CURLOPT_RETURNTRANSFER を true に設定することで、
26    // curl_exec() が結果を直接出力するのではなく、文字列として返します。
27    curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
28    // タイムアウトを10秒に設定
29    curl_setopt($ch1, CURLOPT_TIMEOUT, 10);
30
31    echo "--- 最初のcURLハンドル (ch1) を使ったリクエスト ---\n";
32    echo "アクセス先: http://example.com\n";
33    $response1 = curl_exec($ch1);
34
35    if ($response1 === false) {
36        echo "エラー: ch1 でのリクエスト中に問題が発生しました: " . curl_error($ch1) . "\n";
37    } else {
38        echo "ch1 からのレスポンスの先頭部分 (200文字):\n";
39        // レスポンスが長いため、最初の200文字だけ表示して簡潔にします。
40        echo substr($response1, 0, 200) . "...\n\n";
41    }
42
43    // 2. curl_copy_handle を使用して、ch1 の設定を新しいハンドル (ch2) にコピーします。
44    //    これにより、ch1のURL、RETURNTRANSFERなどのオプションがch2に引き継がれます。
45    echo "--- curl_copy_handle を使用して ch1 の設定を ch2 にコピー中 ---\n";
46    $ch2 = curl_copy_handle($ch1);
47
48    // コピーに失敗した場合のチェック
49    if ($ch2 === false) {
50        echo "エラー: cURLハンドル (ch2) のコピーに失敗しました。\n";
51        // 最初のハンドルは閉じます
52        curl_close($ch1);
53        return;
54    }
55    echo "ch1 の設定が ch2 に正常にコピーされました。\n\n";
56
57
58    // 3. コピーされたハンドル (ch2) のURLを別のものに変更します。
59    //    これは、コピーされたハンドルが元のハンドルから独立していることを示します。
60    curl_setopt($ch2, CURLOPT_URL, "http://www.php.net"); // PHP公式サイトに変更
61
62    echo "--- コピーされたcURLハンドル (ch2) を使ったリクエスト ---\n";
63    echo "アクセス先: http://www.php.net (URLを変更しました)\n";
64    $response2 = curl_exec($ch2);
65
66    if ($response2 === false) {
67        echo "エラー: ch2 でのリクエスト中に問題が発生しました: " . curl_error($ch2) . "\n";
68    } else {
69        echo "ch2 からのレスポンスの先頭部分 (200文字):\n";
70        echo substr($response2, 0, 200) . "...\n\n";
71    }
72
73    // 4. 使用したすべてのcURLハンドルを閉じます。
74    //    これにより、関連するリソースが解放されます。
75    curl_close($ch1);
76    curl_close($ch2);
77
78    echo "--- すべてのcURLハンドルを閉じました ---\n";
79    echo "--- cURLハンドルコピーのデモンストレーションを終了 ---\n";
80}
81
82// 関数を実行します
83demonstrateCurlCopyHandle();
84
85?>

PHP 8のcurl_copy_handle関数は、既存のcURLハンドルの設定を新しいCurlHandleオブジェクトにコピーするために使用されます。この関数は、すでに設定済みのURL、オプション、クッキーなどの情報を新しいハンドルに引き継ぎたい場合に非常に便利です。引数としてコピーしたい元のCurlHandleオブジェクトを指定します。関数が成功すると、元のハンドルの設定が引き継がれた新しいCurlHandleオブジェクトが返されます。もしコピーに失敗した場合はfalseが返されるため、戻り値の確認が重要です。サンプルコードでは、最初に初期化したCurlHandleをこの関数でコピーし、コピーしたハンドルのURLだけを変更して別のWebサイトにアクセスしています。これは、コピーされたハンドルが元のハンドルから独立しており、独自のオプション設定やリクエスト実行が可能であることを示しており、効率的なcURLリソースの再利用に役立ちます。

curl_copy_handleは、既存のcURLハンドルの設定(URLやオプションなど)を新しいハンドルにコピーする機能です。これにより、共通の設定を持つ複数のcURLリクエストを効率的に準備できます。コピーされたハンドルは元のハンドルから完全に独立しているため、コピー後にその設定を変更しても、元のハンドルには影響しません。各cURL操作の後には、関数がfalseを返していないか常に確認し、エラーが発生した場合はcurl_error()で詳細を確認する習慣をつけましょう。すべてのcURLハンドルは、使用後に必ずcurl_close()で閉じ、関連するシステムリソースを適切に解放することが重要です。

PHP cURLハンドルのコピーと独立リクエスト

1<?php
2
3/**
4 * cURLハンドルのコピーと独立したリクエストの実行例。
5 *
6 * この関数は、既存のcURLハンドルをコピーし、コピーしたハンドルに対して異なる設定を適用して
7 * 独立したHTTPリクエストを実行する方法を示します。最後に、それぞれのハンドルを閉じます。
8 * これは、複数の関連するリクエストを効率的に管理する際に役立ちます。
9 */
10function demonstrateCurlCopyHandle(): void
11{
12    // 1. 最初のcURLハンドルを初期化
13    // HTTPリクエストを行うためのcURLセッションを開始します。
14    $ch1 = curl_init();
15
16    if ($ch1 === false) {
17        echo "エラー: cURLハンドル1の初期化に失敗しました。\n";
18        return;
19    }
20
21    // 共通の基本設定を適用
22    $baseUrl = 'https://jsonplaceholder.typicode.com';
23    curl_setopt($ch1, CURLOPT_URL, $baseUrl . '/posts/1');
24    curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); // 結果を文字列として取得する設定
25    curl_setopt($ch1, CURLOPT_TIMEOUT, 5); // タイムアウトを5秒に設定
26
27    echo "=== ハンドル1 (ch1) でリクエストを送信 ===\n";
28    echo "URL: " . $baseUrl . "/posts/1\n";
29
30    // ch1でリクエストを実行し、結果を表示
31    $response1 = curl_exec($ch1);
32    if ($response1 === false) {
33        echo "エラー: ch1 でのリクエスト実行に失敗しました。\n";
34        echo "cURLエラー: " . curl_error($ch1) . "\n";
35    } else {
36        echo "ch1からの応答 (一部):\n" . substr($response1, 0, 150) . "...\n\n";
37    }
38
39    // 2. 既存のcURLハンドル (ch1) をコピーして新しいハンドル (ch2) を作成
40    // ch2はch1のすべての設定を引き継ぎます。
41    $ch2 = curl_copy_handle($ch1);
42
43    if ($ch2 === false) {
44        echo "エラー: cURLハンドルのコピーに失敗しました。\n";
45        curl_close($ch1); // エラー時は元のハンドルも閉じる
46        return;
47    }
48
49    // 3. コピーしたハンドル (ch2) に個別の設定を適用
50    // ch2はch1とは独立して設定を変更できます。ここでは異なるURLを設定します。
51    $newUrlForCh2 = $baseUrl . '/comments/1';
52    curl_setopt($ch2, CURLOPT_URL, $newUrlForCh2);
53    curl_setopt($ch2, CURLOPT_TIMEOUT, 3); // ch2のタイムアウトを3秒に短縮
54
55    echo "=== ハンドル2 (ch2) でリクエストを送信 ===\n";
56    echo "URL: " . $newUrlForCh2 . "\n";
57
58    // ch2でリクエストを実行し、結果を表示
59    $response2 = curl_exec($ch2);
60    if ($response2 === false) {
61        echo "エラー: ch2 でのリクエスト実行に失敗しました。\n";
62        echo "cURLエラー: " . curl_error($ch2) . "\n";
63    } else {
64        echo "ch2からの応答 (一部):\n" . substr($response2, 0, 150) . "...\n\n";
65    }
66
67    // 4. 使用済みcURLハンドルを閉じる
68    // cURLリソースを解放します。各ハンドルは独立して閉じられます。
69    echo "cURLハンドルを閉じます。\n";
70    curl_close($ch1);
71    curl_close($ch2);
72    echo "すべてのcURLハンドルが閉じられました。\n";
73}
74
75// 関数の実行
76demonstrateCurlCopyHandle();
77
78?>

curl_copy_handle関数は、既存のcURLハンドル(CurlHandle型)の設定をすべてコピーし、新しい独立したcURLハンドルを作成するために使用されます。これにより、同じ基本設定を持つ複数のHTTPリクエストを効率的に準備し、それぞれに個別の変更を加えて実行することが可能になります。

引数にはコピー元のcURLハンドル$handleを指定し、成功した場合は設定が引き継がれた新しいcURLハンドルを、失敗した場合はfalseを返します。

このサンプルコードでは、まずcurl_init$ch1という最初のcURLハンドルを初期化し、共通のURLや戻り値の設定を行います。次に、curl_copy_handle($ch1)を実行して$ch1の設定を完全に引き継いだ$ch2を作成します。$ch2$ch1から独立しているため、curl_setoptを使って異なるURLやタイムアウトなどの設定を個別に適用できます。

その後、$ch1$ch2はそれぞれ異なる設定でcurl_execによりHTTPリクエストを実行し、独立した応答を取得します。最終的に、使用を終えたそれぞれのcURLハンドルはcurl_close関数によって適切に閉じられ、関連するシステムリソースが解放されます。これは、プログラムがリソースを効率的に管理する上で非常に重要です。

curl_copy_handleで作成した新しいcURLハンドルは、元のハンドルとは完全に独立して動作します。元の設定は引き継がれますが、コピー後はそれぞれ個別に設定変更やリクエスト実行が可能です。重要な点として、コピー元とコピー先の両方のハンドルは、使用後に必ずcurl_close()で閉じ、システムリソースを適切に解放する必要があります。これを怠ると、リソースリークにつながる可能性があるためご注意ください。また、curl_init()curl_copy_handle()は失敗時にfalseを返すことがあるため、必ず戻り値をチェックし、エラーハンドリングを適切に行うことが安全なコードを書く上で不可欠です。curl_exec()失敗時にはcurl_error()で詳細を確認すると良いでしょう。

関連コンテンツ

関連IT用語

関連プログラミング言語