2016-03-10 16 views
8

Ho una pagina con i clienti e con ajax sto caricando informazioni sul fatto che ci inviino un'email o meno.Esegui imap_close non funzionante

codice simile a questo:

$hostname = '{imap.gmail.com:993/imap/ssl}INBOX'; 
$username = 'email'; 
$password = 'password'; 

$this->session->data['imap_inbox'] = $inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' . imap_last_error()); 

foreach($customers as $customer){ 
    $emails = imap_search($inbox, 'FROM ' . $email); 
    // Processing info 
} 

Ma ci sono circa 20-30 clienti in un'unica pagina, in modo che il proccess prende a volte circa 10-20 secondi per mostrare e sono stato in grado di ottimizzare il processo.

Ma quando il client tenta di ricaricare una pagina, è ancora in attesa prima che imap_search termini, quindi quando ricaricarlo potrebbe richiedere 20 secondi prima che la pagina venga effettivamente ricaricata.

ho cercato di interrompere la ajax con beforeunload funzione e chiudere la imap ma questo non è funzionante.

Il mio codice:

Ajax:

$(window).bind('beforeunload',function(){ 
    imap_email.abort(); // the ajax is succesfully aborted(as showed in console), yet the page still takes considerable time to reload 

    $.ajax({ 
     type: 'GET', 
     url: 'getimapmails&kill=1', 
     async:false 
    }); // ajax call to the same function to call imap_close 

}); 

PHP:

if($this->request->get['kill'] == '1'){ 
      imap_close($this->session->data['imap_inbox']); 
      unset($this->session->data['imap_inbox']); 
      $kill == 1; 
      exit; 
     } 

Ma anche se il ajax viene interrotta e imap_close è chiamato variabile tenendo imap_open, ci vuole ancora 10- 20 secondi per ricaricare la pagina, quindi presumo che l'imap non sia stata chiusa.

Come si chiude lo imap in modo che la pagina possa essere ricaricata immediatamente?

+0

Avete dei registri imap che potete guardare mentre state aggiornando per vedere se sta chiudendo la connessione o no? A questo punto sembra che tu debba lavorare su imap tuning su codice. – mkaatman

+0

Potrebbe esserci un problema di blocco della sessione; – itzmukeshy7

risposta

1

Se ho capito correttamente, il codice che richiede molto tempo si trova all'interno del ciclo foreach().

Ora, anche se si effettua una seconda richiesta di uccidere la sessione IMAP, che ciclo foreach() continuerà fino a quando finisce o PHP uccide se (e quando) tempo di esecuzione supera l'impostazione max_execution_time.

In ogni caso, è necessario qualcosa all'interno del ciclo foreach() che verificherà ogni round se è stata soddisfatta una condizione di annullamento, in modo da interrompere in modo imprevisto la richiesta corrente e consentire al client di crearne una nuova.

io suggerisco di guardare la funzione PHP connection_aborted(), che si potrebbe usare per rilevare una volta che il cliente interrompe la richiesta corrente, e più in generale si poteva leggere sul tema della connection handling per ottenere una migliore senso di come le connessioni e le richieste sono gestito in PHP.

2

Suggerirei uccidendolo con la creazione di un file che causa una rottura:

$hostname = '{imap.gmail.com:993/imap/ssl}INBOX'; 
$username = 'email'; 
$password = 'password'; 

$this->session->data['imap_inbox'] = $inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' . imap_last_error()); 

foreach($customers as $customer){ 
     clearstatcache(); //Can't use the cached result. 
    if(file_exists('/tmp/kill_imap.'.$this->session->id)) break; //making the assumption that /tmp and session->id are set, but the idea is a temporary folder and a unique identifier to that session. 
    $emails = imap_search($inbox, 'FROM ' . $email); 
    // Processing info 
} 
if(file_exists('/tmp/kill_imap.'.$this->session->id)) unlink('/tmp/kill_imap.'.$this->session->id); 

Poi sulla vostra uscita ajax, basta chiamare ad uno script PHP che crea semplicemente quel file. e interromperà il ciclo e rimuoverà il file.