6 votes

PHP - Arrêter et attraper le code qui prend trop de temps

Je voudrais limiter une section spécifique de PHP à X secondes - si cela prend plus de temps, tuer le code en cours d'exécution (juste la section, pas le script entier) et lancer un code alternatif.

Exemple de pseudo-code (l'exemple de cas d'utilisation ici est une API instable qui est parfois rapide et d'autres fois un trou noir) :

$completed = 1;
$seconds = 60;
while ($completed != -1 && $completed < 5) {
    limit ($seconds) {
        $api = new SomeAPI('user','secret','key');
        $data = $api->getStuff('user="bob"');
        $completed = -1;
    } catch () {
        $completed++;
        sleep(10);
    }
}
if ($completed === 5) echo "Error: API black-hole'd 5 times.\n";
else {
    //Notice: data processing is OUTSIDE of the time limit
    foreach ($data as $row) {
          echo $row['name'].': '.$row['message']."\n";
    }
}

CEPENDANT, cela devrait fonctionner pour tout ce qui est . Pas seulement les demandes API/HTTP. Par exemple, une procédure intensive de base de données.

Au cas où vous liriez trop vite : set_time_limit y max_execution_time sont no la réponse car ils affectent le délai de la tout le script plutôt qu'une simple section (à moins que je ne me trompe sur leur fonctionnement, bien sûr).

3voto

Mike Brant Points 39322

Dans le cas d'un appel d'API, je suggère d'utiliser cURL, pour lequel vous pouvez définir un délai d'attente spécifique pour l'appel d'API.

Pour une utilisation générique, vous pouvez examiner les processus de bifurcation, qui vous donneraient la possibilité de chronométrer chaque processus et de le tuer s'il dépasse le temps prévu.

Bien sûr, si la section de code peut être sujette à de longs temps d'exécution en raison d'une structure de boucle hautement répétitive, vous pouvez fournir vos propres temporisateurs pour sortir de la boucle après un intervalle de temps spécifié.

Je n'ai peut-être pas répondu directement à votre question, mais ce que je voulais dire, c'est que vous devrez peut-être utiliser une approche différente en fonction de ce que fait réellement le bloc de code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X