Ajax, impossibile attendere oltre 30 sec

E' possibile fare attendere una richiesta fatta al db tramite Ajax oltre i 30 secondi?

Mi spiego meglio, ho una query con circa 70 record, ogni record ha un campo data che viene passato ad una funzione per effettuare un controllo, fin quando chiedo la stampa di una parte dei record tutto ok, ma quando chiedo l'elenco completo questa impiega più di 30 secondi e va in errore:

Fatal error: Maximum execution time of 30 seconds exceeded

Come posso risolvere? penso sia per motivi di sicurezza di Ajax ma devo cmq risolvere. Se la richiesta viene fatta senza passare per Ajax tutto ok ma così vedo solo una pagina bianca e non più il messaggio di attesa.

Grazie,

ciao.

inviato 7 anni fa
Nando
X 0 X
Se la richiesta viene fatta senza passare per Ajax tutto ok ma così vedo solo una pagina bianca e non più il messaggio di attesa.

Cioè la richiesta della lista completa senza ajax non ti da errore?

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Quel messaggio di errore da chi viene prodotto? Dove viene visualizzato?

risposto 7 anni fa
Gianni Tomasicchio
X 0 X

Per risolvere il problema basta usare la funzione  set_time_limit()

Se non vuoi dare un tempo preciso basta fare così: set_time_limit(0);

per info: http://it2.php.net/manual/en/function.set-time-limit.php

Ciao =)

Edit: Non avevo letto la seconda parte del messaggio XD, comunque prova lo stesso a vedere se funziona, :D

risposto 7 anni fa
Hroud
modificato 7 anni fa
X 0 X

Il problema di tutto è questo script:

function calcola_gg($data_manutenzione) 
{ 
    $dal = $data_manutenzione; 
    $al = date("d/m/Y"); 

    $data_dal = explode('/', $dal); 
    $data_al = explode('/', $al); 

    $ts_da = mktime(0, 0, 0, $data_dal[0], $data_dal[1], $data_dal[2]); 
    $ts_a = mktime(0, 0, 0, $data_al[1], $data_al[0], $data_al[2]); 

    for ($x = $ts_da; $x <= $ts_a; $x += 86400) { 
        $giorni[] = date('d/m/Y', $x); 
    } 

    $totale = count($giorni)-1; 

    if($totale >= 0 && $totale < 30) { 
        $gg = '<img src="images/pallino_verde.gif" width="20" height="20" />'; 
    } elseif ($totale >= 30 && $totale < 60 ) { 
        $gg = '<img src="images/pallino_giallo.gif" width="20" height="20" />'; 
    } elseif ($totale >= 60) { 
        $gg = '<img src="images/pallino_rosso.gif" width="20" height="20" />'; 
    } 
    return $gg; 
}

ma avendo messo adesso set_time_limit(0); prima dello richiesta al db funziona, ma impiega ben 120secondi esatti prima di restituirmi i record, troppo lunga l'attesa.

L'errore di cui al post precedente fa riferimento a questo ciclo:

for ($x = $ts_da; $x <= $ts_a; $x += 86400) { $giorni[] = date('d/m/Y', $x); }

ho messo la funzione SetInterval() nella pagina ajax prima della chiamata ma niente da fare.

Se invece non passo da ajax ma faccio la chiamata alla pagina alla vecchia maniera, tramie action form, allora tutto ok.

risposto 7 anni fa
Nando
X 0 X

Se ho ben capito devi calcolare la differenza di giorni tra due date, giusto?

Se è così, prima di tutto:

$ts_da = mktime(0, 0, 0, $data_dal[0], $data_dal[1], $data_dal[2]); 
$ts_a = mktime(0, 0, 0, $data_al[1], $data_al[0], $data_al[2]);

Rispettando l'ordine 0,0,0,month,day,year $ts_da è sbagliato a meno che non ricevi prima il mese che il giorno in $data_manutenzione ovvero se $data_manutenzione = m/d/y.

Se vuoi calcolare il numero di giorni ti basta fare la differenza tra le due date formato unix.

$n_gg = ($ts_a-$ts_da)/86400;

Se ho compreso ciò che hai richiesto questa soluzione dovrebbe andare bene.

risposto 7 anni fa
Hroud
X 0 X

Essendo una connessione a db SQL Server gestisco il formato della variabile $dal_dal direttamente al momento della creazione della query altrimenti mi ritroverei una data del tipo 21/04/2009 00:00:00.

Ho corretto la variabile $data_al in Date("m/d/Y") in modo da avere adesso

$ts_da = mktime(0, 0, 0, $data_dal[0], $data_dal[1], $data_dal[2]);

$ts_a = mktime(0, 0, 0, $data_al[0], $data_al[1], $data_al[2]);

fin qui tutto ok, ho fatto la modifica che mi hai suggerito ma non funziona, il risultato della ricerca per l'elenco completo avviene in circa 3 secondi ma non funziona per come dovrebbe, cioè, mi restituisce per quasi tutti lo stesso valore, icona verde, mentre per altri ho il seguente errore:

Warning: mktime() expects parameter 4 to be long, string given in function.php on line 34

la riga 34 è: $ts_da = mktime(0, 0, 0, $data_dal[0], $data_dal[1], $data_dal[2]);

inoltre in alcuni campi insieme all'errore restituisce anche dei valori strani, del tipo 208.958333333

risposto 7 anni fa
Nando
modificato 7 anni fa
X 0 X

Ok, forse c'è stato un fraintendimento XD, quello che volevo dire era questo:

function calcola_gg($data_manutenzione) 
{ 
    $dal = $data_manutenzione; //formato data: d/m/Y
    $al = date("d/m/Y"); 

    $data_dal = explode('/', $dal); 
    $data_al = explode('/', $al); 

    / * La funzione mktime richiede i parametri: mktime(ora,minuti,secondi,MESE,giorno,anno);
         era qui l'errore, tu invertivi il giorno con il mese e quindi ti sballava i risultati */

    $ts_da = mktime(0, 0, 0,$data_dal[1],$data_dal[0], $data_dal[2]); 
    $ts_a = mktime(0, 0, 0, $data_al[1], $data_al[0], $data_al[2]);

    $n_g = ($ts_a-$ts_da)/86400;

    if($totale >= 0 && $totale < 30) { 
        $gg = "verde"; 
    } elseif ($totale >= 30 && $totale < 60 ) { 
        $gg = "giallo"; 
    } elseif ($totale >= 60) { 
        $gg = "rosso";
    } 
    return $gg;
}

Prova così, probabilmente tutti quegli errori erano una conseguenza di questo. Fammi sapere.

Ciao

risposto 7 anni fa
Hroud
X 0 X

Grazie tantissime, adesso funziona alla grande, restituisce tutti i record in meno di 1 secondo e senza più errori.

Grazie tante a tutti.  O0

 :bye:

risposto 7 anni fa
Nando
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda