2011-09-27 8 views
11

Utilizzando set_time_limit() o max_execution_time, non "realmente" limiti (tranne su Windows) il tempo di esecuzione, perché, come indicato nel manuale di PHP:"vero" tempo di esecuzione limite

Nota:

La funzione set_time_limit() e la direttiva di configurazione max_execution_time influiscono solo sul tempo di esecuzione dello script stesso. Qualsiasi tempo speso per attività che si verificano all'esterno dell'esecuzione dello script come chiamate di sistema utilizzando system(), operazioni di streaming, query di database, ecc. Non è incluso quando si determina il tempo massimo dello script . Questo non è vero su Windows dove il tempo misurato è reale.

Una soluzione è proposed in PHP comments di avere un limite di tempo di esecuzione "reale" come quello che sto cercando, ma ho trovato poco chiaro/confusione.

+2

Un limite di tempo reale esecuzione viene impostato dal sistema esecuzione del processo. Può uccidere il processo se viene raggiunto il limite (noto anche come limite rigido). È un vero limite quindi, normalmente basato sul tempo della CPU, ovvero il tempo effettivo consumato da un processo (non esattamente per quanto tempo il processo è già in esecuzione). – hakre

+5

La soluzione suggerita in [il commento che si sta parlando] (http://www.php.net/manual/en/function.set-time-limit.php#105569) sembra buono per me - fino a quando si dispone di Disponibili le funzioni POSIX e pcntl. Che cosa esattamente non capisci a riguardo? – DaveRandom

+0

Guardando in modo più approfondito il suggerimento nei commenti del manuale PHP è stato utile :) All'inizio non capivo come funzionasse (non sono abituato alla gestione dei thread). –

risposta

3

Potrei sbagliarmi, ma per quanto ho capito chiedere di spiegazione del "commenti PHP" codice di soluzione.

Il trucco è generare un processo figlio, utilizzando la funzione pcntl_fork, che interromperà il processo originale (padre) dopo un certo timeout. pcntl_fork Funzione rendimenti processo id del processo figlio appena creato all'interno di un thread di esecuzione processo padre e lo zero all'interno processo figlio thread di esecuzione. Ciò significa processo padre eseguirà il codice sotto se dichiarazione e il processo figlio eseguiranno codice sotto altro. E come possiamo vedere dal codice, il processo genitore eseguirà un ciclo infinito mentre il processo figlio attenderà 5 secondi e poi ucciderà il genitore. Quindi in pratica vuoi fare qualcosa del genere:

$real_execution_time_limit = 60; // one minute 

if (pcntl_fork()) 
{ 
    // some long time code which should be 
    // terminated after $real_execution_time_limit seconds passed if it's not 
    // finished by that time 
} 
else 
{ 
    sleep($real_execution_time_limit); 
    posix_kill(posix_getppid(), SIGKILL); 
} 

Spero di averlo spiegato bene. Fatemi sapere se avete domande su questa soluzione.