2016-03-10 7 views
8

Ich habe Seite mit Kunden und mit Ajax im Laden von Informationen darüber, ob sie uns E-Mail senden oder nicht.Ausführen imap_close funktioniert nicht

-Code sieht wie folgt aus:

$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 
} 

Aber es gibt etwa 20 bis 30 Kunden auf der einen Seite, so dass die proccess dauert manchmal etwa 10-20 Sekunden um zu zeigen, und ich war nicht in der Lage, den Prozess zu optimieren.

Wenn der Client versucht, eine Seite neu zu laden, wartet er immer noch, bis imap_search fertig ist. Beim erneuten Laden kann es also 20 Sekunden dauern, bis die Seite tatsächlich neu geladen wird.

Ich habe versucht, die ajax mit beforeunload Funktion zu brechen und die imap zu schließen, aber das funktioniert nicht.

Mein Code:

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; 
     } 

Aber auch wenn die ajax abgebrochen und imap_close heißt auf variable imap_open hält, ist es noch dauert 10- 20 Sekunden um die Seite neu zu laden, also gehe ich davon aus, dass der Imap nicht geschlossen wurde.

Wie schließe ich die imap, damit die Seite sofort neu laden kann?

+0

Haben Sie irgendwelche Imap-Logs, die Sie sehen können, während Sie aktualisieren, um zu sehen, ob es die Verbindung schließt oder nicht? Es fühlt sich im Allgemeinen so an, als müssten Sie an diesem Punkt an der Imap-Optimierung des Codes arbeiten. – mkaatman

+0

Es kann ein Problem der Sitzungssperre geben; – itzmukeshy7

Antwort

1

Wenn ich richtig verstanden habe, liegt der zeitaufwendige Code innerhalb der foreach() - Schleife.

Nun, auch wenn Sie eine zweite Anforderung, um die IMAP-Sitzung, dass foreach() Schleife wird auch weiterhin zu töten, bis sie entweder beendet oder PHP tötet es wenn (und wann) Ausführungszeit Ihre max_execution_time Einstellung überschreitet.

In jedem Fall benötigen Sie etwas innerhalb Ihrer foreach() - Schleife, das bei jeder Runde prüft, ob eine Abbruchbedingung erfüllt ist, um die aktuelle Anfrage zu beenden und dem Client zu erlauben, eine neue zu erstellen.

Ich schlage vor, Sie schauen auf die PHP-Funktion connection_aborted(), dass Sie zu erkennen, verwenden könnte, wenn der Client die aktuelle Anforderung abgebrochen und allgemeiner könnten Sie zum Thema connection handling lesen ein besseres Gefühl dafür, wie Verbindungen und Anfragen zu bekommen sind in PHP behandelt.

2

würde ich empfehlen, es zu töten, indem eine Datei erstellen, die eine Pause verursacht:

$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); 

Dann auf Ihre Ausfahrt Ajax, rufen Sie einfach an ein PHP-Skript, das die Datei erstellt einfach. und es wird Ihre Schleife brechen und die Datei entfernen.

Verwandte Themen