Lors de l'utilisation de PHP pour des demandes de réseau simultanées élevées, les frais généraux de la poignée de main HTTPS sont souvent l'un des goulots d'étranglement des performances. Chaque demande HTTPS nécessite un processus de poignée TLS complet, qui affecte considérablement la vitesse de réponse globale lorsque plusieurs demandes sont lancées en peu de temps. Heureusement, Curl fournit la fonction Curl_share_Init , qui peut multiplexer les données de connexion entre plusieurs demandes en partageant des poignées, réduisant ainsi la fréquence des poignées de main HTTPS et améliorant l'efficacité.
CURL_SHARE_INIT est une fonction de l'extension Curl qui est utilisée pour initialiser une poignée partagée. Grâce à cette poignée partagée, différentes sessions Curl peuvent partager des informations telles que le cache DNS, la session SSL, les cookies, etc. Cela signifie que si plusieurs demandes pointent vers le même nom de domaine et les séances SSL partagées sont activées, les demandes peuvent réutiliser la prise de main HTTPS précédente, réduisant considérablement la latence et la consommation de CPU.
Voici un exemple de code pratique qui utilise curl_share_init pour partager une session HTTPS:
<?php
// Initialiser la poignée partagée
$sh = curl_share_init();
// Définir les options de partage,Ouvrir SSL Partage de session
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
// Préparer plusieurs demandes
$urls = [
'https://m66.net/api/endpoint1',
'https://m66.net/api/endpoint2',
'https://m66.net/api/endpoint3',
];
foreach ($urls as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SHARE, $sh); // Poignée partagée de l'application
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Curl error: ' . curl_error($ch) . "\n";
} else {
echo "Response from {$url}:\n$response\n\n";
}
curl_close($ch);
}
// Nettoyer les poignées partagées
curl_share_close($sh);
?>
Dans cet exemple, les trois demandes indiquent différentes interfaces sous le nom de domaine M66.NET , et toutes partagent la session SSL via la même poignée partagée. Cela signifie qu'après avoir terminé la poignée de main HTTPS pour la première demande, les demandes suivantes peuvent réutiliser les sessions existantes, évitant ainsi le processus de poignée de main répété.
Sécurité des threads : Bien que PHP lui-même soit unique, si vous utilisez une poignée partagée dans un environnement multi-thread, vous devez prêter attention aux problèmes de synchronisation des threads.
Utilisez CURLSHOPT_UNSHARE : Si vous avez besoin de déposer un certain type de données (comme un cookie ou un cache DNS) à un certain stade, vous pouvez utiliser Curlshopt_unshare .
La réutilisation du même hôte est efficace : une session SSL partagée ne peut prendre effet que entre le même hôte (hôte) et le port, et ne peut pas être partagé entre les noms de domaine.
En utilisant Curl_share_Init et des configurations de poignée partagées raisonnablement, nous pouvons réduire efficacement la surcharge du système de la poignée de main TLS lors de la fabrication d'un grand nombre de demandes HTTPS. Cela présente des avantages importants dans la communication microservice, les demandes d'API à haute fréquence, les données rampant et autres scénarios. Améliore non seulement les performances, mais réduit également la consommation de ressources des serveurs et des clients, mais c'est une compétence importante dans la programmation de réseaux à haute performance PHP.