2013-02-20 15 views
5

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).

+0

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

+0

Supponiamo che 'max_execution_time' sia già impostato su ∞ –

+0

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

risposta

3

Nel caso di una chiamata API, suggerirei di utilizzare cURL, per il quale è possibile impostare un timeout specifico per la chiamata API.

Per uso generico, è possibile esaminare i processi di biforcazione, che potrebbero darti la possibilità di cronometrare ogni processo e ucciderlo se supera il tempo previsto.

Ovviamente se la sezione di codice potrebbe essere soggetta a tempi di esecuzione lunghi a causa di una struttura di loop altamente ripetitiva, è possibile fornire ai propri timer l'interruzione del ciclo dopo un intervallo di tempo specificato.

Potrei non aver risposto direttamente alla tua domanda, ma in realtà il punto che volevo ottenere è che potresti dover utilizzare un approccio diverso a seconda di ciò che effettivamente fa il blocco di codice.

Problemi correlati