Dans le développement Web moderne, la gestion d'un grand nombre de demandes HTTP est une exigence commune, telle que les données d'interface par lots, le téléchargement parallèle des ressources, la vérification de l'état du lien, etc. La méthode de demande série traditionnelle (c'est-à-dire une demande se termine puis initie la suivante) est inefficace. À cette fin, PHP fournit des fonctions Curl_Multi_ * Series pour implémenter des demandes simultanées, tandis que la série Curl_Share_ * peut partager des ressources (telles que le cache DNS) entre plusieurs poignées Curl pour optimiser davantage les performances. Cet article présentera comment combiner curl_multi_exec () et curl_share_init () pour obtenir une optimisation efficace de la demande simultanée.
La série de fonctions Curl_Multi_ * nous permet d'envoyer plusieurs demandes HTTP en même temps au lieu d'attendre à la ligne un par un. Son flux de travail principal est:
Initialisez une manche multiple ( curl_multi_init ).
Ajoutez plusieurs poignées faciles ( curl_init ) à la manche multiple.
Utilisez curl_multi_exec () pour générer des demandes simultanées.
Utilisez Curl_Multi_Select () pour attendre la poignée active (éviter le processeur inactif).
Collectez les résultats et fermez des ressources.
Cette méthode convient particulièrement aux scénarios où un grand nombre de demandes sont nécessaires pour traiter en même temps, telles que les robots, l'agrégation d'interface, le préchauffage CDN, etc.
Bien que Curl_Multi_ * puisse envoyer des demandes simultanées, chaque poignée facile est indépendante par défaut, par exemple, chacune doit résoudre les DN séparément, maintenir ses propres cookies, etc. La série de fonctions Curl_share_ * permet de plusieurs poignées faciles pour partager certaines ressources internes (telles que le cache DNS, les séances SSL, les cookies, etc.), qui peuvent éviter les travaux en double, améliorer les performances et réduire les performances et réduire les ponts de la mémoire.
Les étapes de base comprennent:
Utilisez curl_share_init () pour créer un objet partagé.
Utilisez curl_share_setopt () pour définir le contenu partagé (tel que curlshopt_share).
Utilisez Curl_setopt ($ ch, curlopt_share, $ share) pour attacher un objet partagé à une poignée facile.
Libérez l'objet partagé une fois la demande terminée.
Voici un exemple de code PHP qui est réellement exécuté:
<?php
// Des demandes simultanées sont requisesURLListe
$urls = [
'https://m66.net/api/endpoint1',
'https://m66.net/api/endpoint2',
'https://m66.net/api/endpoint3',
'https://m66.net/api/endpoint4'
];
// initialisation multi handle
$multiHandle = curl_multi_init();
// Créer un objet partagé
$shareHandle = curl_share_init();
curl_share_setopt($shareHandle, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
// Stocker chacun easy handle
$curlHandles = [];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SHARE, $shareHandle);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[$url] = $ch;
}
// Effectuer des demandes simultanées
$active = null;
do {
$mrc = curl_multi_exec($multiHandle, $active);
if ($mrc == CURLM_CALL_MULTI_PERFORM) {
continue;
}
curl_multi_select($multiHandle);
} while ($active && $mrc == CURLM_OK);
// Collecter les résultats
$responses = [];
foreach ($curlHandles as $url => $ch) {
$responses[$url] = curl_multi_getcontent($ch);
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
// fermeture multi handle et share handle
curl_multi_close($multiHandle);
curl_share_close($shareHandle);
// Résultats d'impression
foreach ($responses as $url => $content) {
echo "Response from $url:\n";
echo $content . "\n\n";
}
? Utilisez CURL_MULTI_ pour améliorer les performances de la concurrence *: lancer et traiter plusieurs demandes simultanément, réduisant considérablement le temps total.
? Utilisez Curl_share_ pour enregistrer les frais généraux en double *: En partageant des ressources telles que le cache DNS, évitez l'analyse en double et améliorez l'efficacité globale.
? Remarque Release des ressources : Une fois la demande terminée, n'oubliez pas de libérer chaque poignée, manche multiple et manche de partage facile, sinon elle peut provoquer une fuite de mémoire.
? Combiné avec curl_multi_select () : attendez l'activité du réseau pour éviter l'occupation du processeur de 100%.
Demandes d'agrégation d'interface simultanées élevées.
Bork rampant d'un grand nombre de pages ou de fichiers.
Surveillance du site Web et chèques de santé.
CDN ou échauffement du cache.
L'utilisation de curl_multi_exec () et curl_share_init () peut non seulement atteindre une vraie concurrence, mais aussi réduire le travail en double grâce au partage des ressources, ce qui rend PHP plus efficace et stable lors de la gestion des demandes de réseau très concurrentes.
Si vous rencontrez des goulots d'étranglement d'optimisation dans les applications réelles, vous pouvez combiner davantage la mise en commun des connexions, la planification des tâches, la gestion des exceptions et d'autres moyens pour améliorer la solution globale.