CURLを使用することは、特に多数のAPIリクエストを作成する場合、複数のHTTPリクエストを含むPHPプログラムを開発する場合、一般的な選択です。効率を向上させるために、PHPはマルチスレッドCurl処理機能curl_multi_*を提供し、複数のリクエストを並行して送信できます。これにより、プログラムは、次々に応答を待つのではなく、複数のリクエストを同時に処理できます。
ただし、マルチスレッドカールを使用する場合、リクエストを送信するだけでなく、実行ステータス、エラー情報、各リクエストのコンテンツをリアルタイムで返したデータなどのデータを取得する必要があります。 curl_multi_info_read()関数は、この情報を取得するのに役立つツールの1つです。
curl_multi_info_read()関数は、複数の並列Curl要求の実行ステータスを取得するPHPの関数です。それを通して、開発者は、複数の要求が並行している場合、各要求の実行の進行状況と各要求のステータスをリアルタイムで監視できます。この関数は、HTTPステータスコードを含む現在のリクエストステータスを含む配列、リクエストが成功したかどうかなどを返します。
curl_multi_info_read()を使用するには、 curl_multi_init()を介してマルチスレッドCurlセッションを初期化し、 Curl_multi_add_handle()を介して複数の個別のCurlハンドルをセッションに追加する必要があります。最後に、 curl_multi_exec()を使用してリクエストを並行して実行し、 curl_multi_info_read()を使用して各リクエストの実行ステータスを取得できます。
簡単な例を次に示します。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// マルチスレッドを初期化します cURL セッション</span></span><span>
</span><span><span class="hljs-variable">$mh</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_init</span></span><span>();
</span><span><span class="hljs-comment">// 複数を作成します cURL ハンドル</span></span><span>
</span><span><span class="hljs-variable">$ch1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>(</span><span><span class="hljs-string">"https://www.example.com"</span></span><span>);
</span><span><span class="hljs-variable">$ch2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>(</span><span><span class="hljs-string">"https://www.example.org"</span></span><span>);
</span><span><span class="hljs-comment">// 設定 cURL オプション</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch1</span></span><span>, CURLOPT_RETURNTRANSFER, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch2</span></span><span>, CURLOPT_RETURNTRANSFER, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-comment">// 意思 cURL ハンドル添加到多线程セッション中</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch1</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch2</span></span><span>);
</span><span><span class="hljs-comment">// リクエストを実行します</span></span><span>
</span><span><span class="hljs-keyword">do</span></span><span> {
</span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_exec</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$active</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$active</span></span><span>) {
</span><span><span class="hljs-comment">// リクエストが完了するのを待ちます</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_multi_select</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>);
}
} </span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$active</span></span><span>);
</span><span><span class="hljs-comment">// 各リクエストの実行ステータスを取得します</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_info_read</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>)) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'result'</span></span><span>] === CURLE_OK) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Request to "</span></span><span> . </span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'handle'</span></span><span>] . </span><span><span class="hljs-string">" succeeded.\n"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Request to "</span></span><span> . </span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'handle'</span></span><span>] . </span><span><span class="hljs-string">" failed with error: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">curl_error</span></span><span>(</span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'handle'</span></span><span>]) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
}
</span><span><span class="hljs-comment">// 掃除</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_multi_remove_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch1</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_multi_remove_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch2</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_multi_close</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
curl_multi_info_read()次のフィールドを含むリクエスト情報を含む配列を返します。
ハンドル:対応するカールハンドル。
結果:実行結果。値がcurle_okの場合、リクエストは成功します。要求が失敗した場合、対応するエラーコードが返されます。
MSG :メッセージタイプが返されました(通常、 curlmsg_done 、リクエストが完了したことを示します)。
関数は配列を返し、要求情報がもうない場合、 nullを返します。
複数の並列要求が行われると、特にリクエスト間に直接的な依存関係がない場合、プログラムの実行効率が大幅に改善されます。 curl_multi_info_read()を使用して、各リクエストのステータスをリアルタイムで監視して、関連する情報を時間内に取得したり、例外を処理したり、リクエストの完了時に返されたデータを取得したりすることができます。
curl_multi_info_read()を使用すると:
リクエストの実行ステータスを取得:リクエストが成功したかどうかを確認します。
要求されたエラーメッセージをキャプチャする:要求が失敗した場合、エラーコードを即座に取得して、その後の処理を簡単にすることができます。
リクエスト応答データをリアルタイムで取得します。リクエストが成功した場合は、返されたデータを取得して処理します。
curl_multi_info_read()は、 HTTP要求がバッチで処理されるいくつかのシナリオで特に重要になります。例えば:
バッチデータクロール:複数のWebサイトを同時にリクエストしてデータを取得して解析します。
並列API呼び出し:複数の外部APIを呼び出す必要がある場合、返されたデータを取得するためにリクエストを同時に開始できます。
大規模な同時リクエスト:ブロックを避けるために複数のリクエストを効率的に送信および処理します。
curl_multi_info_read()は、 PHPで強力で実用的なツールを提供し、複数のCurl要求の実行ステータスを取得します。この機能を合理的に使用することにより、並列要求の進捗を簡単に監視し、エラー情報をキャプチャし、リクエスト結果を取得し、マルチレクエストタスクの実行効率を大幅に改善できます。 Crawlerの開発、バッチデータクロール、または並列API呼び出しのいずれであっても、 curl_multi_info_read()は不可欠なツールです。
関連タグ:
cURL