<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">## 하나、무엇인가요 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)到하나个多 cURL 세션(multi handle)가운데的函数。它的作用예告诉 `curl_multi_exec`:“我这里有하나个新的묻다,请하나并处理它”。
**기능 서명:**
```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 요청에서 각 요청은 동기식 차단됩니다. 즉, 다음 요청은 이전 요청이 완료된 후에 만 실행될 수 있습니다. 여러 인터페이스 나 웹 사이트 데이터를 요청할 때 매우 비효율적입니다. Curl_multi 시리즈 기능의 도입은 비 차단 동시성 처리 솔루션을 제공합니다.
다음은 curl_multi_add_handle을 사용하는 완전한 예입니다. 여러 웹 페이지를 병렬로 요청하는 방법을 보여줍니다.
<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 ()는 모든 작업이 완료 될 때까지 여러 통화가 필요할 수 있으며, 이는 일반적으로 do-while 루프와 결합됩니다.
Curl_multi_Select ()는 유휴 CPU를 피하기 위해 네트워크 응답을 기다리는 데 사용됩니다.
curl_multi_add_handle은 고성능 네트워크 요청을 구축하기위한 기초입니다. 그 역할을 이해하면 PHP의 비동기 처리 기능에 대한 더 깊은 이해를 얻는 데 도움이됩니다. 이를 마스터하면 동시 크롤러 및 다중 인터페이스 집계 요청과 같은 고급 기능을 구현하여 I/O 집약적 시나리오에서 PHP 프로그램의 효율성을 크게 향상시킬 수 있습니다.
샘플 코드를 더 연습하면이 기능을보다 능숙하게 사용하고보다 효율적이고 전문적인 PHP 프로그램을 작성할 수 있습니다.
<span></span>