<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// このドキュメントは、学習および参照目的のためのものです,導入 PHP 真ん中 curl_multi_add_handle 関数の基本的な使用。</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
</span><span><span class="hljs-comment"># curl_multi_add_handle 関数の基本的な使用法の詳細な説明,開始する方法とそれが迅速にどのように機能するかを理解する方法?</span></span><span>
使用中 PHP 並行性 HTTP 要求されたとき,`curl_multi_add_handle` それは非常にコア機能です。それは動作します `curl_multi_init`、`curl_multi_exec` 等しい関数,複数のメッセージを並行して送信することができます cURL 聞く,从而大大提高网络聞く的效率。本文将详细導入 `curl_multi_add_handle` 基本的な使用法,それがどのように機能するかをすぐに理解し、それを実践的に練習するのに役立ちます。
</span><span><span class="hljs-comment">## 1つ、何ですか curl_multi_add_handle?</span></span><span>
`</span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>()` はい PHP 真んシングルを追加するために使用されます cURL 聞く(今すぐ curl handle)到1つ个多 cURL セッション(multi handle)真ん機能します。它的作用はい告诉 `curl_multi_exec`:“我这里有1つ个新的聞く,请1つ并处理它”。
**関数の署名:**
```php
</span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(CurlMultiHandle </span><span><span class="hljs-variable">$multi_handle</span></span><span>, CurlHandle </span><span><span class="hljs-variable">$ch</span></span><span>);
</span></span>
$ multi_handle : curl_multi_init()によって作成された複数のリクエストハンドル。
$ ch : curl_init()によって作成された単一の要求ハンドル。
返品値はブール値であり、追加が成功したかどうかを示します。
デフォルトのCurl要求では、各要求が同期的にブロックされます。つまり、次の要求は前のリクエストが完了した後にのみ実行できます。これは、複数のインターフェイスまたはWebサイトデータを要求する場合、非常に非効率的です。 curl_multiシリーズ関数の導入は、非ブロッキングの並行性処理ソリューションを提供します。
curl_multi_add_handleを使用した完全な例を次に示します。複数のWebページを並行してリクエストする方法を示します。
<span><span><span class="hljs-variable">$urls</span></span><span> = [
</span><span><span class="hljs-string">"https://www.example.com/"</span></span><span>,
</span><span><span class="hljs-string">"https://www.php.net/"</span></span><span>,
</span><span><span class="hljs-string">"https://www.wikipedia.org/"</span></span><span>
];
</span><span><span class="hljs-variable">$multiHandle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_init</span></span><span>();
</span><span><span class="hljs-variable">$curlHandles</span></span><span> = [];
</span><span><span class="hljs-comment">// 初始化每个聞く并添加到 multi handle 真ん中</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$urls</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$url</span></span><span>) {
</span><span><span class="hljs-variable">$ch</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">curl_setopt_array</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, [
CURLOPT_URL => </span><span><span class="hljs-variable">$url</span></span><span>,
CURLOPT_RETURNTRANSFER => </span><span><span class="hljs-literal">true</span></span><span>,
CURLOPT_TIMEOUT => </span><span><span class="hljs-number">10</span></span><span>
]);
</span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>, </span><span><span class="hljs-variable">$ch</span></span><span>);
</span><span><span class="hljs-variable">$curlHandles</span></span><span>[] = </span><span><span class="hljs-variable">$ch</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">$multiHandle</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-title function_ invoke__">curl_multi_select</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>); </span><span><span class="hljs-comment">// 待って I/O</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-variable">$status</span></span><span> == CURLM_OK);
</span><span><span class="hljs-comment">// 結果を取得します</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$curlHandles</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$ch</span></span><span>) {
</span><span><span class="hljs-variable">$content</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_getcontent</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>);
</span><span><span class="hljs-variable">$info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_getinfo</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"URL: "</span></span><span> . </span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'url'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"HTTP Code: "</span></span><span> . </span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'http_code'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Content Length: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$content</span></span><span>) . </span><span><span class="hljs-string">"\n\n"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">curl_multi_remove_handle</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>, </span><span><span class="hljs-variable">$ch</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_close</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">curl_multi_close</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>);
</span></span>
curl_multi_init()を使用してマルチハンドルを作成します。
各URLの通常のカールハンドルを作成し、パラメーターを設定します。
curl_multi_add_handle()を使用して、各ハンドルをマルチハンドルに追加します。
curl_multi_exec()を使用して、すべてのリクエストの実行を開始します。
curl_multi_select()を使用して、アクティブな接続が発生するまでブロックします。
すべてのリクエストを処理した後、 curl_multi_remove_handle()を使用してすべてのハンドルを削除および閉じることを忘れないでください。
各ハンドルには、マルチハンドルに追加する前に、必要なすべてのcurlopt_*パラメーターが設定されている必要があります。
リソースをクリーンアップすることを忘れないでください: curl_multi_remove_handle()およびcurl_close() 。
curl_multi_exec()は、すべての操作が完了するまで複数の呼び出しを必要とする場合があります。これは通常、ループと組み合わされます。
curl_multi_select()は、アイドルCPUを避けるためにネットワーク応答を待つために使用されます。
curl_multi_add_handleは、高性能ネットワークリクエストを構築するための基礎です。その役割を理解することは、PHPの非同期処理能力をより深く理解するのに役立ちます。それをマスターすることにより、同時クローラーやマルチインターフェイス集約要求などの高度な関数を実装し、I/O集約シナリオでPHPプログラムの効率を大幅に改善できます。
サンプルコードをさらに練習することにより、この機能をより巧みに使用し、より効率的でプロフェッショナルなPHPプログラムを作成できるようになります。
<span></span>