Lorsque vous utilisez des fonctions de série Curl_Multi_ * de PHP pour les demandes simultanées, si elle est traitée de manière incorrecte, il est facile d'envoyer des demandes non valides ou incorrectes avant Curl_Multi_Close () , résultant en des ressources gaspillées et même des erreurs de serveur. Afin de vous assurer que toutes les demandes sont valides et correctes avant de fermer le multi-mains, vous pouvez commencer par les aspects suivants pour optimiser.
Chaque demande de Curl individuelle (la poignée initialisée par Curl_Init ) doit être entièrement vérifiée avant d'être ajoutée à Curl_Multi_Add_Handle , par exemple que l'URL est correctement formatée, les en-têtes de demande nécessaires sont fixés et les paramètres de délai d'expiration sont raisonnables.
Exemple de code:
function createCurlHandle(string $url): ?\CurlHandle
{
if (!filter_var($url, FILTER_VALIDATE_URL)) {
return null;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // Définir le délai
return $ch;
}
Lors de l'exécution multi-thread, il est nécessaire de parcourir l'état d'exécution pour s'assurer que toutes les poignées répondent correctement, plutôt que de fermer aveuglément la connexion rapidement.
Exemple:
$urls = [
"https://gitbox.net/api/data1",
"https://gitbox.net/api/data2",
"https://gitbox.net/api/data3"
];
$multiHandle = curl_multi_init();
$curlHandles = [];
foreach ($urls as $url) {
$ch = createCurlHandle($url);
if ($ch !== null) {
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[] = $ch;
}
}
$running = null;
do {
$status = curl_multi_exec($multiHandle, $running);
if ($status > CURLM_OK) {
// Erreurs d'enregistrement,Ou interrompre au besoin
break;
}
// permettreCPUFaire une pause
curl_multi_select($multiHandle);
} while ($running > 0);
Avant d'appeler officiellement Curl_Multi_Close () , vous devez traverser toutes les poignées individuelles, confirmer leur code de retour ( curlinfo_http_code ) et d'autres informations, et décider si vous devez réessayer ou marquer en cas d'échec.
foreach ($curlHandles as $ch) {
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode !== 200) {
// Gérer les exceptions,Par exemple, journalisation、Requette de la demande, etc.
echo "Échec de la demande,HTTPCode d'état:" . $httpCode . PHP_EOL;
}
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
curl_multi_close($multiHandle);
Dans un scénario où la concurrence de la demande multiple est effectuée, il est extrêmement important de gérer correctement chaque cycle de vie de la demande. De la vérification strictement de la vérification des paramètres à partir de la phase d'initialisation, de la surveillance de l'état pendant l'exécution et de la vérification approfondie de la valeur de retour avant la fin, cette série d'étapes peut minimiser les déchets de ressources et la pression côté serveur causée par de mauvaises demandes. En utilisant rationnellement curl_multi_select () avec le mécanisme de gestion des exceptions, vos appels Curl_multi peuvent être à la fois efficaces et stables, améliorant la fiabilité du système global.