2016-03-10 23 views
8

私は、顧客がいるページを持っています。imap_closeが実行されていない

コードは次のようになります。

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

しかし、そこに1ページの20-30顧客は大まかなので、proccessを表示するために、時には約10〜20秒かかり、私はプロセスを最適化することができませんでした。

クライアントがページをリロードしようとすると、imap_searchが終了するまでまだ待機しているので、ページを再読み込みするとページが実際にリロードされるまでに20秒かかることがあります。

beforeunloadajaxを中止して、を終了しようとしましたが、これは機能しません。

マイコード:

アヤックス:

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

しかしajaxが中止され、imap_closeimap_openを保持する変数で呼び出されていても、それはまだ取り、10-ページがリロードされるのに20秒かかるので、私はIMAPが閉じられていないと仮定しています。

imapを閉じるとページがすぐに読み込まれるようにするにはどうすればよいですか?

+0

接続を終了しているかどうかを確認するためにリフレッシュしている間に見ることができるすべてのIMAPログがありますか?現時点では、コードを調整するためにimapを操作する必要があるように感じられます。 – mkaatman

+0

セッションロックの問題がある可能性があります。 – itzmukeshy7

答えて

1

私が正しく理解していれば、時間のかかるコードはforeach()ループ内にあります。あなたはIMAPセッションを殺すために第2の要求を作る場合でも、今

、どちらかそれはを終了または(と)実行時間は、あなたのmax_execution_timeに設定を超えた場合 PHPはそれをを殺すまで、そののforeach()ループは継続されます。

いずれの場合でも、foreach()ループの中で、中止する条件が満たされた場合に各ラウンドをチェックするものが必要です。これにより、現在の要求をスイッチバックしてクライアントが新しいものを作成できるようになります。

私は、クライアントが現在の要求を中止したら、あなたは検出するのに使用できることを、あなたはPHPの機能connection_aborted()で見てください、そしてより一般的にはあなたが接続し、要求があるかのより良い感覚を得るためにconnection handlingのトピックを読むことができますPHPで処理されます。

2

私は休憩を引き起こしファイル作成することによって、それを殺し推薦する:単にそのファイルを作成するPHPスクリプトを呼び出して、あなたの出口アヤックスに続いて

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

を。あなたのループを壊してファイルを削除します。

関連する問題