【PHP8.x】curl_multi_getcontent関数の使い方
curl_multi_getcontent関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
curl_multi_getcontent関数は、PHPのcURL拡張機能の一部として、複数のウェブサイトへのリクエストを並行して処理する「マルチCURL」の仕組みにおいて、個々の通信が完了した後にその応答内容(コンテンツ)を取得するために実行する関数です。
この関数は、curl_multi_exec()などの関数で同時に実行された複数のCURLリクエストの中から、特定のCURLハンドル(個々の通信を識別するためのもの)が正常に完了した際に、その通信によって取得されたデータ本体(ウェブページのHTMLソースコードやAPIからのJSONデータなど)を取り出す目的で使用されます。具体的には、引数として、コンテンツを取得したいCURLハンドルを一つ指定します。関数が成功すると、サーバーからの応答ボディが文字列として返されます。もし、指定されたCURLハンドルがまだ処理中であるか、何らかのエラーが発生した場合には、falseが返されることがあります。
複数のウェブサイトから情報を効率的に収集したり、複数のAPIエンドポイントへ並行してアクセスして結果を統合したりするような、時間のかかるネットワーク通信処理を高速化する際に、この関数は各通信の最終的な結果を確認するために重要な役割を果たします。
構文(syntax)
1<?php 2// 有効な cURL ハンドルを想定 3$ch = curl_init(); 4 5// 実際の使用では、$ch は curl_multi_add_handle() で追加され、 6// curl_multi_exec() で処理が完了した後の個別の cURL ハンドルです。 7// 例としてダミーのURLを設定 8curl_setopt($ch, CURLOPT_URL, 'http://example.com'); 9curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 10 11// ここで curl_multi_exec() などのマルチリクエスト処理が行われ、 12// $ch のリクエストが完了したと仮定します。 13 14$content = curl_multi_getcontent($ch); 15 16// $content には取得された文字列、または失敗時に false が格納されます。 17// var_dump($content); 18 19curl_close($ch); 20?>
引数(parameters)
CurlHandle $multi_handle, CurlHandle $handle
- CurlHandle $multi_handle: 複数の転送を管理するためのCurlHandleオブジェクト
- CurlHandle $handle: コンテンツを取得したい個別の転送のためのCurlHandleオブジェクト
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP: curl_multi_getcontentで並列リクエスト結果を取得する
1<?php 2 3// 並列処理で複数のcurlリクエストを実行し、個別のリクエストの結果を取得するサンプル 4 5// マルチハンドルを初期化 6$mh = curl_multi_init(); 7 8// 複数のcurlハンドルを初期化 9$ch1 = curl_init("https://www.example.com/"); 10$ch2 = curl_init("https://www.google.com/"); 11 12// 各curlハンドルにオプションを設定 (必要に応じて) 13curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); 14curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); 15 16// マルチハンドルにcurlハンドルを追加 17curl_multi_add_handle($mh, $ch1); 18curl_multi_add_handle($mh, $ch2); 19 20$active = null; 21// 複数のリクエストを同時に実行 22do { 23 $mrc = curl_multi_exec($mh, $active); 24} while ($mrc == CURLM_CALL_MULTI_PERFORM); 25 26while ($active && $mrc == CURLM_OK) { 27 if (curl_multi_select($mh) != -1) { 28 do { 29 $mrc = curl_multi_exec($mh, $active); 30 } while ($mrc == CURLM_CALL_MULTI_PERFORM); 31 } else { 32 break; 33 } 34} 35 36// 個々のリクエストの結果を取得 37$content1 = curl_multi_getcontent($ch1); 38$content2 = curl_multi_getcontent($ch2); 39 40// 結果を表示 41echo "example.com content: " . substr($content1, 0, 100) . "...\n"; 42echo "google.com content: " . substr($content2, 0, 100) . "...\n"; 43 44// curlハンドルを削除 45curl_multi_remove_handle($mh, $ch1); 46curl_multi_remove_handle($mh, $ch2); 47 48// マルチハンドルを閉じる 49curl_multi_close($mh); 50 51curl_close($ch1); 52curl_close($ch2); 53?>
このサンプルコードは、PHPのcurl_multi_getcontent関数を使用して、複数のcurlリクエストを並行して実行し、個々のリクエストの結果を取得する方法を示しています。システムエンジニアを目指す初心者の方にも理解しやすいように、各ステップを解説します。
まず、curl_multi_init関数でマルチハンドルを初期化します。これは、複数のcurlリクエストをまとめて管理するためのものです。次に、curl_init関数で個別のcurlハンドルを初期化し、取得したいURLを設定します。必要に応じて、curl_setopt関数でcurlハンドルにオプションを設定します。この例では、CURLOPT_RETURNTRANSFERオプションをtrueに設定し、レスポンスを文字列として取得するようにしています。
curl_multi_add_handle関数で、個々のcurlハンドルをマルチハンドルに追加します。これにより、複数のリクエストを並行して実行できるようになります。curl_multi_exec関数とcurl_multi_select関数を使用して、実際のリクエストを実行し、レスポンスを待ちます。
curl_multi_getcontent関数は、指定されたcurlハンドルに対応するリクエストの結果(コンテンツ)を文字列として返します。引数には、マルチハンドルと、コンテンツを取得したいcurlハンドルを指定します。この関数自体は戻り値を持ちませんが、指定したcurlハンドルからコンテンツを取得します。サンプルコードでは、curl_multi_getcontent関数を使って、各リクエストの結果を$content1と$content2に格納し、それぞれ最初の100文字を表示しています。
最後に、curl_multi_remove_handle関数でマルチハンドルからcurlハンドルを削除し、curl_multi_close関数でマルチハンドルを閉じます。また、個別のcurlハンドルもcurl_close関数で閉じます。この一連の処理により、複数のHTTPリクエストを効率的に処理し、結果を個別に取得することができます。
curl_multi_getcontentは、マルチハンドルで実行した個別のcurlハンドルの結果を取得する関数です。引数にはマルチハンドル自体ではなく、個別のcurlハンドルを渡す必要があります。サンプルコードでは、$ch1と$ch2に対してcurl_multi_getcontentを呼び出し、それぞれの結果を取得しています。
初心者が間違いやすい点として、curl_multi_getcontentを呼び出す前に、curl_multi_execでリクエストが完了していることを確認する必要があります。リクエストが完了していない状態で呼び出すと、期待する結果が得られない場合があります。
また、サンプルコードでは、取得したコンテンツをsubstrで切り出して表示しています。これは、コンテンツ全体を表示すると長すぎる場合があるためです。CURLOPT_RETURNTRANSFERオプションをtrueに設定することで、curl_exec()の戻り値として結果が文字列で返されるようになります。この設定がないと、画面に直接出力されてしまうため注意が必要です。最後に、リソースを解放するためにcurl_closeを呼び出すことを忘れないでください。