Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    interrompere un processo dopo un certo tot

    Ciao a tutti,
    in PHP lancio una funzione che, per via dell'enorme lavoro che deve eseguire, ci mette, a seconda del file da elaborare, circa 6 o 7 secondi...
    E' possibile creare un timer che, se la funzione non ha finito di lavorare entro esempio 10 secondi, restituisce un messaggio di errore mio personalizzato?? Senza dover arrivare al timeout di 30s previsto dal php.ini e che, essendo un fatal error, impedisce la visualizzazione della pagina... Vorrei un mio messaggio in modo tale da poterlo "impaginare".
    Esiste qualcosa di simile??

    PS: set_time_limit() purtroppo restituisce il solito fatal error altrimenti sarebbe stato comodo

    Grazie in anticipo
    ~Wakka~

  2. #2
    Utente di HTML.it L'avatar di Takeno
    Registrato dal
    May 2007
    Messaggi
    146
    Premetto che non mi è mai capitato e che sto cercando di documentarmi ora

    E premetto che non posso provarlo ora ^^"


    Codice PHP:
    set_time_limit(10);
    function 
    sorryAndGoodBye() { die('Spiacente, timeout!'); }
    register_shutdown_function('sorryAndGoodBye'); 

    Se ho capito bene la funzione, register_shutdown_function esegue la funzione quando lo script finisce o muore. (die o exit)


    Doc register_shutdown_function

  3. #3
    Originariamente inviato da Takeno
    Premetto che non mi è mai capitato e che sto cercando di documentarmi ora

    E premetto che non posso provarlo ora ^^"


    Codice PHP:
    set_time_limit(10);
    function 
    sorryAndGoodBye() { die('Spiacente, timeout!'); }
    register_shutdown_function('sorryAndGoodBye'); 

    Se ho capito bene la funzione, register_shutdown_function esegue la funzione quando lo script finisce o muore. (die o exit)


    Doc register_shutdown_function
    Mmm...ma nel caso di funzioni dentro l'oggetto che normalmente richiamerei con $this->funzione() come si potrebbe fare ?
    ~Wakka~

  4. #4
    Utente di HTML.it L'avatar di Takeno
    Registrato dal
    May 2007
    Messaggi
    146
    Scusa, non ho capito

    quelle tre righe servono semplicemente a visualizzare un messaggio d'errore qualora andasse in timeout, senza bloccare completamente la pagina con il fatal error.

  5. #5
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    si ma influisce a livello globale, quindi come dici te dai 10 secondi per TUTTO lo script, non per il singolo ciclo...

    questo potrebbe essere un esempi su ciclo...

    Codice PHP:
    $start=time();

    while(
    true){
        
    //tuo codice
        
        
    if(time() > $start+10){
            echo 
    "sono passati 10 secondi... troppi!
    "
    ;
            break; 
    //blocca il ciclo e continua l'esecuzione del resto del codice
            
    }
        } 
    se sei all' interno di un metodo o una funzione e vuoi farla finire subito togli break; e metti return;
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  6. #6
    Originariamente inviato da Takeno
    Scusa, non ho capito

    quelle tre righe servono semplicemente a visualizzare un messaggio d'errore qualora andasse in timeout, senza bloccare completamente la pagina con il fatal error.
    Forse saro' io, ma a me non funziona...
    Non sono all'interno di un ciclo, altrimenti avrei fatto cosi'.
    Sono all'interno di una funzione che elabora un file e potrebbe andare in timeout a seconda della grandezza del file! E quindi, per non lasciare l'utente con la scritta 'Elaborazione in corso" gli mostro "File e' troppo grande", esempio
    ~Wakka~

  7. #7
    Utente di HTML.it L'avatar di Takeno
    Registrato dal
    May 2007
    Messaggi
    146
    Vediamo di arrivarci ragionando.

    Quando io faccio l'upload di un file, premo Sfoglia, seleziono il file e il percorso viene memorizzato nel form. Quando invio il form, insieme ai dati del form mando anche il file.

    Se la mente non mi inganna, la pagina PHP viene caricata solo quando il server ha finito di ricevere il file che viene messo dentro la cartella temporanea, pronto per essere spostato.

    Se fin qui è tutto giusto, non si tratta di un timeout del php ma semplicemente della lentezza nel caricamento.

    Se questo è il tuo problema, non puoi far altro che settare la grandezza massima del file che viene mandato.
    Se invece ho toppato alla grande, spero qualcuno mi corregga :S

    __________________________________________________ ____________________

    Se invece si tratta di file del server e lo script php parte tranquillo, puoi fare come in questo esempio che ho testato poco fa

    Codice PHP:
    set_time_limit(2); //imposto il limite massimo d'esecuzione

    function shutDownFunction() { //imposto la funzione che mi farà uscire il messaggio
        
    $error error_get_last();
            
    print_r($error);
        if (
    $error['type'] == 1) { //type == 1 è il timeout dello script
            
    echo "E' accaduto un errore! Lo script e' andato in timeout";
        }

    register_shutdown_function('shutdownFunction'); //gli dico che alla fine dello script (o quando si blocca per un fatal) deve lanciare quella funzione.

    // Ora lancio il mio codice, qualunque esso sia, che se causerà un fatal error, farà lanciare la funzione.
    while(true)   //in questo caso è un ciclo infinito che andrà in timeout dopo 2 secondi, come settato sopra.
        
    $a 1

  8. #8
    Originariamente inviato da Takeno
    Se invece si tratta di file del server e lo script php parte tranquillo, puoi fare come in questo esempio che ho testato poco fa

    Codice PHP:
    set_time_limit(2); //imposto il limite massimo d'esecuzione

    function shutDownFunction() { //imposto la funzione che mi farà uscire il messaggio
        
    $error error_get_last();
            
    print_r($error);
        if (
    $error['type'] == 1) { //type == 1 è il timeout dello script
            
    echo "E' accaduto un errore! Lo script e' andato in timeout";
        }

    register_shutdown_function('shutdownFunction'); //gli dico che alla fine dello script (o quando si blocca per un fatal) deve lanciare quella funzione.

    // Ora lancio il mio codice, qualunque esso sia, che se causerà un fatal error, farà lanciare la funzione.
    while(true)   //in questo caso è un ciclo infinito che andrà in timeout dopo 2 secondi, come settato sopra.
        
    $a 1
    Il mio e' il secondo caso...
    La questione e' piu' complicata di quanto mi aspettassi quando ho scritto la domanda...
    Allora, la mia situazione e' la seguente:
    il server elabora un file molto grosso, e potrebbe scadere in timeout.
    Il fatto e' che a me non serve che scriva un semplice messaggio...nella tua funzione infatti ci ho messo un
    Codice PHP:
    return 'timeout'
    che dovrebbe essere captato dallo script che l'ha richiamato e mostrare a video un altro messaggio che corrisponde al 'key' 'timeout'.
    Il fatto e' che, andando in timeout, si ha il fatal error e lo script viene arrestato dal php e non procede!

    Esiste un modo per ovviare a questo??
    ~Wakka~

  9. #9
    Utente di HTML.it L'avatar di Takeno
    Registrato dal
    May 2007
    Messaggi
    146
    return 'timeout' non può servire a nulla. Perché quando finisce lo script o si arresta lancia quell'ultima funzione prima di fermarsi definitivamente.


    Quindi o ci metti un echo con l'errore, oppure includi una pagina d'errore.
    Il return non serve a nulla.


    Potresti postare il codice ? Magari troviamo il modo migliore per farlo.

  10. #10
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    guarda.... il tuo

    codice:
    il server elabora un file molto grosso, e potrebbe scadere in timeout.
    non aiuta nessuno a capire REALMENTE in che situazione ti trovi...

    cosa fai quando lo elabori?
    una regexp?
    un ciclo?
    mescoli le parole?
    lo converti?
    modifichi un' immagine?
    lo bruci?
    lo duplichi 1000 volte?
    lo mandi per e-mail?
    ci scrivi una canzone?

    se non ci dici come lo elabori è difficile dirti come comportarsi...
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.