我有客户页面和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
以便页面可以立即重新加载?
答案 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将
在任何情况下,你需要forepa()循环中的某些内容,如果满足中止条件,将检查每一轮,以便switfly终止当前请求并允许客户端创建新请求。
我建议您查看PHP函数connection_aborted(),您可以在客户端中止当前请求时使用它来检测,更一般地说,您可以阅读connection handling主题以获得更好的效果感知如何在PHP中处理连接和请求。