Vorrei limitare una sezione specifica di PHP a X secondi - se impiega più tempo, elimina il codice attualmente in esecuzione (solo la sezione, non l'intero script) ed esegui un codice alternativo.PHP - Arresta e cattura il codice che impiega troppo tempo
esempio di codice Pseudo (Esempio di utilizzo caso ecco un'API instabile che a volte è veloce e altre volte il suo un buco nero):
$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";
}
}
Tuttavia, questo dovrebbe funzionare per nulla. Non solo richieste API/HTTP. Per esempio. una procedura di database intensiva.
Nel caso in cui stai leggendo troppo in fretta:set_time_limit
e max_execution_time
sono non la risposta in quanto influenzano il limite di tempo per l'intero script piuttosto che solo una sezione (a meno che non mi sbaglio su come quelle lavoro, ovviamente).
Se l'API si basa su cURL, è possibile dare un'occhiata a [parametro timeout] (http://stackoverflow.com/questions/2582057/setting-curls-timeout-in-php). – moonwave99
Supponiamo che 'max_execution_time' sia già impostato su ∞ –
Forse qualcosa da provare (se non si usa curl) utilizzerebbe un sistema di elaborazione asincrono, come Gearman, secondo SO, possono essere fermati a metà strada attraverso l'elaborazione: http://stackoverflow.com/domande/2270323/arresto-Gearman-lavoratori-piacevolmente – ChrisK