Lorsque vous utilisez PHP pour les demandes HTTP simultanées à grande échelle, Curl est l'un des outils sous-jacents préférés des développeurs. PHP fournit une variété de fonctions qui interagissent avec Curl, et Curl_Share_Sstreror est une fonction moins largement comprise mais très utile lors du débogage de la poignée de partage de boucles . Alors, peut-il vraiment fonctionner dans un environnement de concurrence élevé? Comment devrions-nous l'utiliser efficacement?
curl_share_streror (int $ error_code): la chaîne est une fonction fournie par PHP pour obtenir la chaîne Description du code d'erreur lié à la poignée de partage Curl . Son objectif principal est d'aider les développeurs à déboguer les problèmes lors de l'utilisation de fonctions Curl_share_ * série (telles que Curl_share_Init , Curl_Share_Setopt , Curl_share_close ).
Ceci est similaire à notre curl_strer commun, mais la différence est que le premier traite spécifiquement des erreurs liées aux poignées partagées. Les poignées partagées permettent à plusieurs poignées de curl de partager des données telles que les caches DNS, les cookies ou les sessions SSL, améliorant ainsi les performances globales et l'utilisation des ressources pour les demandes élevées simultanées.
Dans un environnement de concurrence élevé, un grand nombre de demandes sont lancées en même temps, et les requêtes DNS, les opérations de cookies et les poignées de main SSL deviendront des goulots d'étranglement du système. Le mécanisme de poignée partagée de Curl est conçu pour résoudre ce type de problème:
Cache DNS partagée : Évitez les requêtes DNS pour chaque demande;
Session SSL partagée : accélérez l'établissement des connexions HTTPS suivantes;
Cookies partagés : il est particulièrement important pour les demandes simultanées qui doivent maintenir l'état.
Lorsque vous utilisez une poignée partagée, une erreur peut se produire si elle est définie de manière incorrecte ou si les conflits de ressources sont trouvés. À l'heure actuelle, Curl_Share_Sstreror peut nous aider à localiser le problème. Il n'affectera pas directement les performances, mais il peut considérablement améliorer le développement et l'efficacité de débogage, aidant ainsi indirectement le système à s'exécuter plus stable.
Par exemple, dans un environnement simultané, si vous essayez à tort de libérer une poignée partagée en même temps sur plusieurs threads, une erreur Curlshe_invalid peut être déclenchée. Avec CURL_SHARE_STRERROR (curlshe_invalid), vous pouvez immédiatement savoir que la poignée partagée est mal utilisée, plutôt que de perdre du temps sur un autre dépannage d'erreur non pertinent.
<span><span><span class="hljs-variable">$sh</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_share_init</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">curl_share_setopt</span></span><span>(</span><span><span class="hljs-variable">$sh</span></span><span>, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
</span><span><span class="hljs-title function_ invoke__">curl_share_setopt</span></span><span>(</span><span><span class="hljs-variable">$sh</span></span><span>, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
</span></span>
Pendant la phase d'initialisation, définir clairement quelles données doivent être partagées est la première étape de l'optimisation des performances.
En combinant les fonctions Curl_Multi_ * Series pour utiliser une poignée partagée, il peut obtenir un traitement simultané plus efficace:
<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-variable">$handles</span></span><span> = [];
</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> < </span><span><span class="hljs-number">10</span></span><span>; </span><span><span class="hljs-variable">$i</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-string">"http://example.com/?q=<span class="hljs-subst">$i</span></span></span><span>");
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, CURLOPT_SHARE, </span><span><span class="hljs-variable">$sh</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, CURLOPT_RETURNTRANSFER, </span><span><span class="hljs-literal">true</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">$ch</span></span><span>);
</span><span><span class="hljs-variable">$handles</span></span><span>[] = </span><span><span class="hljs-variable">$ch</span></span><span>;
}
</span></span>
Cette méthode évite les frais généraux causés par l'établissement répété de connexion et améliore le taux de réutilisation des ressources.
Si vous rencontrez une erreur dans les paramètres de la poignée partagée, utilisez CURL_SHARE_STRERROR pour obtenir le message d'erreur à temps:
<span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">curl_share_setopt</span></span><span>(</span><span><span class="hljs-variable">$sh</span></span><span>, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Share setopt failed: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">curl_share_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">curl_errno</span></span><span>(</span><span><span class="hljs-variable">$sh</span></span><span>)) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span></span>
Bien que ces erreurs ne se produisent pas fréquemment, elles sont très critiques lorsque le système est en ligne ou testé sous pression. Une erreur de poignée partagée difficile à déposer peut entraîner l'échec de toutes les demandes simultanées.
Dans des environnements multipliés ou multiprogés, PHP lui-même ne prend pas en charge de véritables ressources partagées multi-thread, alors assurez-vous qu'il n'y a pas de modifications simultanées lors de l'utilisation de poignées partagées. Les ressources partagées doivent être protégées par des mécanismes de verrouillage, sinon il se retournera.
Bien que Curl_Share_Sstreror lui-même ne soit qu'une fonction d'assistance, il joue un rôle de diagnostic clé dans la gestion des mécanismes de partage de concurrence curl. En pratique, l'utilisation rationnelle de poignées partagées et le positionnement rapide des problèmes avec cette fonction peuvent améliorer considérablement la fiabilité et les performances des demandes simultanées. La maîtrise de cette partie de la technologie apportera des avantages importants à la construction de robots de réseau PHP à haute performance, de passerelles API ou de systèmes de planification des tâches.