Lors du traitement des demandes simultanées élevées, en particulier dans les scénarios où les données de données simultanées ou les appels d'API sont utilisées avec PHP, le coût du chargement en double et de l'établissement de ressources de connexion ne peuvent pas être ignorés. La fonction Curl_Share_Init est une fonctionnalité avancée fournie par Libcurl. Il permet à plusieurs séances de boucle de partager certaines ressources, telles que le cache DNS, les séances SSL et les cookies, améliorant ainsi les performances dans un environnement multi-thread.
Cet article présentera comment utiliser CURL_SHARE_INIT en PHP pour implémenter le partage des ressources Curl et expliquer comment l'utiliser en combinaison avec des exemples.
CURL_SHARE_INIT est une fonction fournie par libcurl pour initialiser une poignée partagée ( poignée de partage de curl ). Cette poignée peut partager des données avec plusieurs demandes de curl, évitant ainsi des processus d'initialisation, d'analyse ou de négociation répétés.
Des scénarios de demande simultanés élevés, tels que l'utilisation de robots multiples ou multi-processus;
Demandes multiples pour accéder au même hôte et doivent partager le cache DNS;
Plusieurs demandes utilisant la même session cookie ou SSL.
Dans PHP, nous pouvons utiliser des fonctions telles que curl_share_init () , curl_share_setopt () et curl_setopt () pour implémenter des ressources partagées. Voici un exemple complet.
<?php
// Initialiser la poignée partagée
$sh = curl_share_init();
// Définir les options de partage,Nous partageons ici Cookie et DNS
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
// Créer plusieurs cURL Session
$urls = [
'https://m66.net/api/data1',
'https://m66.net/api/data2',
];
$chs = [];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Lier les poignées partagées
curl_setopt($ch, CURLOPT_SHARE, $sh);
$chs[] = $ch;
}
// initialisation multi handle
$mh = curl_multi_init();
// Ajouter toutes les demandes à multi handle
foreach ($chs as $ch) {
curl_multi_add_handle($mh, $ch);
}
// Effectuez toutes les demandes
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
// Obtenir des résultats
foreach ($chs as $ch) {
$content = curl_multi_getcontent($ch);
echo "Contenu de réponse:\n" . $content . "\n\n";
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
// Nettoyer
curl_share_close($sh);
curl_multi_close($mh);
?>
Limitation de type de verrouillage partagé : un seul type de verrouillage peut être défini à la fois (comme Curl_lock_data_cookie et curl_lock_data_dns ). Curl_share_setopt doit être appelé plusieurs fois lors de la définition de plusieurs types.
Problèmes de sécurité des threads : Bien que Curl_share soit utilisé dans des scénarios multithread dans le langage C, PHP lui-même n'est pas un thread-safe, donc cette fonction est principalement utilisée pour simuler l'optimisation des ressources de la concurrence (comme Curl_Multi_ * ).
Gestion des erreurs : Dans le développement réel, les vérifications Curl_errno et Curl_error doivent être ajoutées pour s'assurer que l'exécution de la demande est normale.
CURL_SHARE_INIT est un outil puissant qui peut optimiser considérablement les performances dans les scénarios multi-requis. En partageant des ressources entre plusieurs demandes de curl, nous réduisons non seulement les frais généraux des demandes de réseau, mais améliorons également l'efficacité globale du système. En combinaison avec Curl_Multi en PHP, il peut poser une base solide pour les systèmes simultanés à haute performance.
Si vous devez vous connecter à des interfaces tierces ou construire un système de robottes efficace, vous pourriez aussi bien essayer l'effet d'optimisation apporté par Curl_share .