2016-03-10 21 views
8

Tôi có trang với khách hàng và với thông tin tải ajax im về việc họ có gửi email cho chúng tôi hay không.Thực hiện imap_close không hoạt động

Mã trông như thế này:

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

Nhưng có khoảng 20-30 khách hàng trên một trang, vì vậy các proccess mất đôi khi khoảng 10-20 giây để hiển thị và tôi đã không thể tối ưu hóa quá trình này.

Nhưng khi khách hàng cố gắng tải lại trang, nó vẫn đang chờ trước khi kết thúc imap_search, vì vậy khi tải lại, có thể mất 20 giây trước khi trang thực sự được tải lại.

Tôi đã cố gắng hủy bỏ ajax với chức năng beforeunload và đóng imap nhưng điều này không hoạt động.

Mã của tôi:

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

Nhưng mặc dù ajax được hủy bỏ và imap_close được kêu gọi biến giữ imap_open, nó vẫn còn mất 10 20 giây để trang tải lại, vì vậy tôi giả sử imap không bị đóng.

Làm cách nào để đóng imap để trang có thể tải lại ngay lập tức?

+0

Bạn có bất kỳ nhật ký imap nào mà bạn có thể xem trong khi bạn đang làm mới để xem nó có đang đóng kết nối hay không? Nó thường cảm thấy như bạn cần phải làm việc trên imap điều chỉnh trên mã tại thời điểm này. – mkaatman

+0

Có thể có sự cố về khóa phiên; – itzmukeshy7

Trả lời

1

Nếu tôi hiểu chính xác, mã tốn thời gian nằm trong vòng lặp foreach().

Bây giờ, ngay cả khi bạn thực hiện một yêu cầu thứ hai để tiêu diệt các phiên IMAP, đó foreach() vòng lặp sẽ tiếp tục cho đến khi một trong hai nó kết thúc hoặc PHP giết nó nếu (và khi nào) thời gian thực hiện vượt quá khung cảnh max_execution_time của bạn.

Trong mọi trường hợp, bạn cần một cái gì đó trong vòng foreach() của bạn sẽ kiểm tra trên mỗi vòng nếu điều kiện hủy bỏ đã được đáp ứng, để switfly chấm dứt yêu cầu hiện tại và cho phép khách hàng tạo một yêu cầu mới.

Tôi đề nghị bạn xem hàm PHP connection_aborted(), mà bạn có thể sử dụng để phát hiện khi khách hàng hủy yêu cầu hiện tại và nói chung bạn có thể đọc chủ đề connection handling để hiểu rõ hơn về cách kết nối và yêu cầu được xử lý bằng PHP.

2

Tôi muốn giới thiệu giết chết nó bằng cách tạo ra một tập tin đó gây ra một break:

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

Sau đó, trên ajax xuất cảnh của bạn, chỉ cần gọi đến một kịch bản php mà chỉ đơn giản tạo ra tập tin đó. và nó sẽ phá vỡ vòng lặp của bạn và loại bỏ các tập tin.

Các vấn đề liên quan