<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Ce document est à des fins d'apprentissage et de référence,introduire PHP milieu curl_multi_add_handle Utilisation de base des fonctions。</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
</span><span><span class="hljs-comment"># curl_multi_add_handle Explication détaillée de l'utilisation de base des fonctions,Comment commencer et comprendre comment cela fonctionne rapidement?</span></span><span>
Utilisé PHP Concurrence HTTP À la demande,`curl_multi_add_handle` C'est une fonction très centrale。Ça marche `curl_multi_init`、`curl_multi_exec` Fonction égale,Il est possible d'envoyer plusieurs messages en parallèle cURL demander,从而大大提高网络demander的效率。本文将详细introduire `curl_multi_add_handle` Utilisation de base,Vous aide à comprendre rapidement comment cela fonctionne et à le pratiquer。
</span><span><span class="hljs-comment">## un、Qu'est-ce que curl_multi_add_handle?</span></span><span>
`</span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>()` Oui PHP milieu用于添加单个 cURL demander(Tout de suite curl handle)到un个多 cURL Session(multi handle)milieu的函数。它的作用Oui告诉 `curl_multi_exec`:“我这里有un个新的demander,请un并处理它”。
**Signature de la fonction:**
```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 : manche de demande multiple créée par curl_multi_init () .
$ ch : une seule poignée de demande créée par curl_init () .
La valeur de retour est une valeur booléenne, indiquant si l'ajout a réussi.
Dans la demande Curl par défaut, chaque demande est bloquée de manière synchrone, c'est-à-dire que la suivante ne peut être exécutée qu'après la fin de la demande précédente. Ceci est très inefficace lorsque vous demandez plusieurs interfaces ou données sur le site Web. L'introduction des fonctions de la série Curl_Multi fournit une solution de traitement de concurrence non bloquante.
Voici un exemple complet utilisant Curl_Multi_Add_Handle , démontrant comment demander plusieurs pages Web en parallèle:
<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">// 初始化每个demander并添加到 multi handle milieu</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">// 执行所有demander</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">// attendez 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">// Obtenir des résultats</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>
Créez une manche multiple à l'aide de curl_multi_init () .
Créez une poignée de boucle normale pour chaque URL et définissez les paramètres.
Utilisez Curl_Multi_Add_Handle () pour ajouter chaque poignée à la manche multiple.
Utilisez curl_multi_exec () pour démarrer l'exécution de toutes les demandes.
Utilisez curl_multi_select () pour bloquer jusqu'à ce qu'il y ait une connexion active.
Après avoir traité toutes les demandes, n'oubliez pas d'utiliser Curl_Multi_Remove_Handle () pour supprimer et fermer toutes les poignées.
Chaque poignée doit avoir tous les paramètres Curlopt_ * nécessaires réglés avant d'ajouter à la manche multiple.
N'oubliez pas de nettoyer les ressources: curl_multi_remove_handle () et curl_close () .
curl_multi_exec () peut nécessiter plusieurs appels jusqu'à ce que toutes les opérations soient terminées, ce qui est généralement combiné avec une boucle à faire .
curl_multi_select () est utilisé pour attendre la réponse du réseau pour éviter le processeur inactif.
CURL_MULTI_ADD_HANDLE est la base de la construction de demandes de réseau haute performance. Comprendre son rôle vous aidera à mieux comprendre les capacités de traitement asynchrones en PHP. En le maîtrisant, vous pouvez implémenter des fonctions avancées telles que des robots de robots simultanés et des demandes d'agrégation multi-interfaces, améliorant considérablement l'efficacité de vos programmes PHP dans des scénarios à forte intensité d'E / S.
En pratiquant davantage l'exemple de code, vous pourrez utiliser cette fonction plus compétente et écrire des programmes PHP plus efficaces et professionnels.
<span></span>