0
votes

Demande de boucle de répétition PHP jusqu'à ce que httpCode 200 soit reçu

J'ai une simple demande de courbure en PHP comme:

$request = curl_init('https://some/path/');
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_HTTPHEADER, array('Content-Type:application/json','Authorization:'.$token));

$response = curl_exec($request);
$errors = curl_error($request);
$httpcode = curl_getinfo($request, CURLINFO_HTTP_CODE);
curl_close($request);


7 commentaires

À quelle vitesse devez-vous avoir une réponse de 200? Parlons-nous des secondes (un utilisateur attend un résultat), ou minutes (un processus de fond)?


Utilisez une boucle pour toujours jusqu'à ce que vous obtenez le code de statut 200


Et ce service d'API externe n'a-t-il pas de webhooks à utiliser?


Donc, c'est un fichier de mixage musical, 202 Fichier est créé et en étant ajouté pour télécharger URL, 200 est le fichier prêt à télécharger, il faut environ 1 seconde pour chaque minute de fichier WAV, de sorte que cela dépend de la durée de la piste.


Ils ne seraient sûrement pas heureux si vous couriez une boucle sans fin frappant le service encore et encore (pensez à DOS Attack). Je penserais qu'ils ont des webhooks quelque part dans leur documentation de l'API pour la configuration et l'utilisation (où ils indiquent un point de terminaison sur votre serveur lorsque c'est terminé). S'ils ne le font pas ... Eh bien, HRM. Je ne suggérerais que de frapper la boucle une fois par minute avec un cron puis de réduire la surcharge des hits.


Je suggérerais quelque chose comme, initier l'appel de création de fichier et montrer une réponse de succès à l'utilisateur si le fichier est créé. Utilisez ensuite un appel AJAX pour vérifier si le fichier de téléchargement est prêt. Lorsque vous recevez une réponse 200, vous pouvez afficher l'URL de téléchargement sur la même page. Cet appel AJAX peut être répété à intervalles fixes. Ceci est seulement du point de vue de l'utilisateur. Mieux vaut utiliser le Webhooks si possible. IE, lorsque le fichier est prêt à télécharger, la tierce partie ping votre demande avec un message de réussite.


@ Ash1271 qui pourrait fonctionner aussi.


3 Réponses :


1
votes

Vous pouvez utiliser quelque chose de similaire à ce xxx


0 commentaires

1
votes

Pour une référence future, plutôt qu'une boucle infinie spamming la requête que j'ai utilisée sortez code> et pause code>, donc il va essayer toutes les 10 secondes pour max 1 minute, comme Donc:

for($i=0; $i<6; $i++){
    $request = curl_init('https://some/path/');
    curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($request, CURLOPT_HTTPHEADER, array('Content-Type:application/json','Authorization:'.$token));
    
    $response = curl_exec($request);
    $errors = curl_error($request);
    $httpcode = curl_getinfo($request, CURLINFO_HTTP_CODE);
    curl_close($request);
    
    if($httpcode == 200){
        var_dump($response);
        break;
    }
    sleep(10);
}


1 commentaires

Recréer et supprimer la poignée de boucle à l'intérieur de la boucle est un gaspillage de CPU, il utilisera moins de CPU si vous déplacez curl_init () et curl_close () en dehors de la boucle



0
votes
for(;;){
    $response = curl_exec($request);
    $httpcode = curl_getinfo($request, CURLINFO_HTTP_CODE);
    if($httpcode===200){break;}
    sleep(1);
}

0 commentaires