2012-06-29 25 views
5

Questa non è una delle normali domande se il sonno viene conteggiato per un timeout o cose del genere. Ok, ecco il problema: ho impostato max_execution_time per PHP come 15 secondi e idealmente questo dovrebbe scadere quando supera il limite impostato, ma non è così. Apache è stato riavviato dopo la modifica al file php.ini e un ini_get ('max_execution_time') va tutto bene. A volte lo script può durare fino a 200 secondi, il che è pazzesco. Non ho alcuna comunicazione di database. Tutto lo script cerca i file sul filesystem unix e in alcuni casi reindirizza a un'altra pagina JSP. Non c'è sleep() sulla sceneggiatura.PHP max_execution_time non è scaduto

ho calcolare il tempo totale di esecuzione dello script PHP in questo modo:

All'inizio dello script ho impostato:

$_mtime = microtime(); 
$_mtime = explode(" ",$_mtime); 
$_mtime = $_mtime[1] + $_mtime[0]; 
$_gStartTime = $_mtime; 

e l'ora di fine ($ _ gEndTime) è calcolato in modo simile.
Il tempo totale viene calcolato in una funzione di spegnimento che ho registrato:

register_shutdown_function('shutdown'); 
............. 
function shutdown() 
{ 
    .............. 
    .............. 
    $_total_time = $_gEndTime - $_gStartTime; 
    .............. 
    switch (connection_status()) 
    { 
    case CONNECTION_NORMAL: 
     .... 
     break; 
     .... 
    case CONNECTION_TIMEOUT: 
     .... 
     break; 
     ...... 
    } 
} 

Nota: Non posso usare $ _SERVER [ 'REQUEST_TIME'] perché la mia versione di PHP non è compatibile. Questo fa schifo - lo so.

1) Bene, la mia prima domanda ovviamente è: perché il mio script PHP viene eseguito anche dopo il limite di timeout impostato?
2) Apache ha la direttiva Timeout che è 300 secondi ma il file binario di PHP non legge la configurazione di Apache e questo non dovrebbe essere un problema.
3) C'è la possibilità che qualcosa stia inviando PHP in una modalità di sospensione?
4) Sto calcolando il tempo di esecuzione in modo errato? C'è un modo migliore per farlo?


Sono perplesso a questo punto. Wizards PHP: per favore aiuto.

Modifica: Ho appena scoperto che le operazioni di flusso non sono la causa con alcuni registri. Il ritardo è solo casuale all'interno dello script anche quando non sono eseguite operazioni di streaming. Il cambio di contesto potrebbe essere la ragione. Ma non ho ancora una risposta chiara. Ho cercato Real max_execution_time for PHP on linux ma non sono sicuro di volerlo provare. Qualche altro suggerimento?

+0

Credo che le operazioni del file system non vengano conteggiate nei calcoli del limite di tempo. – lonesomeday

+1

Sai, puoi usare 'microtime (true)' per ottenere subito un 'float' indietro ... – deceze

+0

@lonesomeday: ne sei sicuro? –

risposta

7

max_execution_time unici limiti di script di tempo esecuzione stessa - tempo cpu dello script. se il contesto del sistema operativo è passato a un altro processo e vi ha trascorso del tempo, non verrà conteggiato. Quindi misurare il tempo reale e prevedere un timeout dopo 30 secondi non sarà vero in qualsiasi momento. E, naturalmente, non tiene conto qualsiasi system, exec o volte di rete, nonché

+2

Infatti .. Anche l'attesa per le query DB o la gestione dei flussi di dati viene lasciata fuori dall'equazione – Johan

+0

true, ho dimenticato di menzionare le cose in db;) grazie! – poncha

+0

Non ho alcun sistema, chiamate exec, anche se non chiamo alcun codice esterno. Le operazioni del file system vengono conteggiate entro il limite max_execution_time? Supponi, un fopen() –

0

Se è necessario per terminare dopo un certo periodo di tempo (come da commenti) perché non chiamare

$startscript = microtime(); 

//do some stuff 

if (microtime() - $startscript > 1500) 
{ 
    dotimeout(); 
} 


    // do more stuff 

if (microtime() - $startscript > 1500) 
{ 
    dotimeout(); 
} 

    // do more stuff 

if (microtime() - $startscript > 1500) 
{ 
    dotimeout(); 
} 

Si ottiene il jist. Non molto carina ma potrebbe funzionare.

+0

Questo potrebbe funzionare quando so dove si verificherà il ritardo. Ma nel mio caso, i ritardi sono casuali. Quindi, per esempio: se viene passato il primo controllo e il microtime() - $ startcript è un valore che è <1500 e se il ritardo si verifica prima che venga chiamato il secondo controllo, è di nuovo la stessa storia. Grazie comunque...! –

Problemi correlati