<?php if (is_user_logged_in());
?>Je tente d'effectuer une requête PHP vers une API externe, mais la requête expire périodiquement, même si le point de terminaison de l'API semble être en ligne et répondre normalement lorsque je le teste directement.
Le problème ne se produit pas à chaque requête. Certaines requêtes s'exécutent en moins d'une seconde, tandis que d'autres attendent jusqu'à l'expiration du délai.
Je cherche à déterminer si ce problème est plus susceptible d'être dû à ma configuration PHP, à l'API distante, à la latence DNS /network ou à la manière dont je traite la requête.
Code PHP actuel
<?php
$url = 'https://api.example.com/products';
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTPHEADER => <span class="text-token-text-primary cursor-text rounded-sm" data-placeholder-token="true">[
'Accept: application/json',
]</span>,
]);
$response = curl_exec($ch);
if ($response === false) {
echo 'cURL Error: ' . curl_error($ch);
} else {
$data = json_decode($response, true);
echo '<pre>';
print_r($data);
echo '</pre>';
}
curl_close($ch);Ce que j'ai déjà vérifié
- L'URL de l'API se charge correctement lors d'un test direct.
- cURL est activé sur le serveur.
- La plupart des requêtes fonctionnent
- L'augmentation de
CURLOPT_TIMEOUTne fait qu'allonger le temps de réponse des requêtes ayant échoué avant le retour d'une erreur. - Le serveur lui-même ne semble pas présenter une utilisation anormalement élevée du processeur ou de la mémoire.
- Le problème se produit de manière intermittente et non à chaque requête.
Exemple d'erreur.
cURL error 28:
Operation timed out after 30001 milliseconds
with 0 bytes receivedCe que j'essaie de comprendre.
Quelle serait la meilleure façon de résoudre ce problème ?
Recommanderiez-vous de vérifier :
- Le temps de résolution DNS ?
- Le temps de connexion, indépendamment du temps total de la requête ?
- Les en-têtes de réponse du serveur distant ?
- Les limites PHP-FPM ?
- Les règles de pare-feu ou de connexion sortante ?
- La logique de nouvelle tentative ?
- Le débit de l’API Limitation ?
- Journalisation des informations détaillées de temps d'exécution de cURL ?
Je souhaiterais également savoir si la relance automatique de la requête est une bonne approche, ou si cela pourrait aggraver le problème si l'API distante rencontre déjà des difficultés.
Si les relances sont appropriées, quelle serait une stratégie de relance raisonnable en PHP sans provoquer de requêtes dupliquées ni de charge inutile ?
Ajout de CSS et HTML pour les tests :
.testt {
}<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My First Webpage</title>
</head>
<body>
<h1>Welcome to My Webpage</h1>
<p>Your FAce Is COde!.</p>
</body>
</html>
2 Answers