执行imap_close无法正常工作

时间:2016-03-10 14:36:47

标签: javascript php jquery ajax imap

我有客户页面和ajax我正在加载有关他们是否向我们发送电子邮件的信息。

代码如下所示:

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

但是在一个页面上大约有20-30个客户,因此过程有时需要大约10-20秒才能显示,我无法优化过程。

但是当客户端尝试重新加载页面时,它仍然在imap_search完成之前等待,因此在重新加载时可能需要20秒才能实际重新加载页面。

我尝试使用ajax函数中止beforeunload并关闭imap,但这不起作用。

我的代码:

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

但即使ajax被中止并且变量持有imap_close上调用imap_open,页面重新加载仍需要10-20秒,所以我假设imap没有关闭。

如何关闭imap以便页面可以立即重新加载?

2 个答案:

答案 0 :(得分:2)

我建议通过创建导致休息的文件来杀死它:

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

然后在你的退出ajax上,只需调用一个简单创建该文件的php脚本。它会破坏你的循环并删除文件。

答案 1 :(得分:1)

如果我理解正确,那么耗时的代码就在foreach()循环中。

现在,即使您发出第二个请求终止IMAP会话,该foreach()循环也将继续,直到它完成 PHP将 when)执行时间超过你的max_execution_time设置。

在任何情况下,你需要forepa()循环中的某些内容,如果满足中止条件,将检查每一轮,以便switfly终止当前请求并允许客户端创建新请求。

我建议您查看PHP函数connection_aborted(),您可以在客户端中止当前请求时使用它来检测,更一般地说,您可以阅读connection handling主题以获得更好的效果感知如何在PHP中处理连接和请求。