2011-09-27 12 views
8

Potrei dire che la mia domanda è legata al PHP, ma quello che mi interessa di più è la corretta logica di programmazione in situazioni in cui l'esecuzione della funzione può andare avanti indefinitamente.esecuzione funzione limite di tempo in PHP o qualsiasi altra cosa

Qual è il modo corretto di monitorare il tempo necessario per eseguire alcune funzioni e come interrompere questa esecuzione e continuare con il resto del programma?

OK, so che per esempio c'è una funzione set_time_limit() che restituisce un errore fatale ma non voglio questo, voglio che il mio codice continui solo dopo x secondi, o forse dopo il superamento del tempo genera un'eccezione, prenderlo e fare qualcos'altro?

Sta scrivendo una specie di soluzione di funzione "cane da guardia" e come si fa?

Grazie per l'aiuto che è possibile fornire, qualsiasi collegamento, qualsiasi articolo che risolva questo problema in un modo che "dovrebbe" essere fatto.

BR, Newman

+1

Qual è il contesto, in particolare? Immagino che la funzione contenga una specie di loop. Se questo è corretto, il mio primo istinto sarebbe di prendere un timestamp con 'microtime()' prima di entrare nel ciclo e quindi confrontare quel timestamp con uno che viene generato all'interno del ciclo ad ogni iterazione. Al raggiungimento di un certo valore, potresti lanciare un'eccezione o fare qualsiasi altra cosa. Forse ho erroneamente interpretato il contesto di ciò che stai cercando di fare, comunque. Stai cercando qualcosa che puoi applicare più facilmente a numerose funzioni? – Pete171

+0

sì, qualcosa del genere.il mio problema è che una delle mie funzioni sta cercando di telnet su altri dispositivi e talvolta il timeout di telnet è troppo lungo. – newman555p

risposta

3

PHP non fornisce un modo generale di una funzione timeout. Ma molti componenti in cui questo problema è comune consentono di definire un timeout.

Esempi:

  • Il HTTP Stream Wrapper consente di specificare un timeout un'opzione:

    file_get_contents('http://example.com', false, stream_context_create(
        array('http' => array('timeout' => 10 /* seconds */)) 
    )); 
    
  • DOP (strato di astrazione del database) consente di impostare un timeout utilizzando il PDO::ATTR_TIMEOUT attribute (si noti che questo attributo può significare cose diverse con diversi driver di database):

    $pdo->setAttribute(PDO::ATTR_TIMEOUT, 10 /* seconds */); 
    
  • È possibile impostare un timeout di connessione quando si utilizza FTP:

    $ftp = ftp_connect('example.com', 21, 10 /* seconds */) 
    

Allo stesso modo tutte le altre estensioni che accedono potenzialmente risorse remote fornirà tali parametri di timeout o opzioni.

0

In PHP, in particolare, non penso che tu abbia un modo valido per controllare il tempo di esecuzione delle tue funzioni al di fuori di esse. Come hai detto tu, cose come set_time_limit generano un errore Fatar e uccidono il tuo script.

Suggerirei di messaggiare il tempo di esecuzione dall'interno delle funzioni, utilizzando cose come microtime() e generare un'eccezione se il limite di tempo è superato; un'eccezione che sarai in grado di catturare all'esterno e continuare ad agire di conseguenza.

+0

OK, lo proverò come quello. ma come viene affrontato questo problema in generale (non in PHP)? – newman555p

+0

Penso che dipenda dalla lingua che stai usando. Alcuni come Earlang consentono al programmatore di allegare il processo consentendo loro di controllarsi a vicenda. Non so se esiste una tecnica standard per gestire questo scenario, ma se c'è, per favore commentami facendomi sapere il nome :) – Deleteman

Problemi correlati