2016-03-10 7 views
8

मेरे पास ग्राहकों के साथ पृष्ठ है और AJAX आईएम लोडिंग जानकारी के साथ यह है कि वे हमें ईमेल भेजते हैं या नहीं।निष्पादित 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 
} 

लेकिन वहाँ लगभग एक पृष्ठ पर 20-30 ग्राहक हैं, इसलिए प्रक्रिया कभी कभी के बारे में 10-20 सेकंड लेता है दिखाने के लिए और मैं इस प्रक्रिया का अनुकूलन करने में असमर्थ था।

लेकिन जब ग्राहक किसी पृष्ठ को फिर से लोड करने का प्रयास करता है, तो यह अभी भी imap_search खत्म होने से पहले प्रतीक्षा कर रहा है, इसलिए जब पृष्ठ को वास्तव में पुनः लोड करने से पहले इसे पुनः लोड करने में 20 सेकंड लग सकते हैं।

मैंने ajax को beforeunload फ़ंक्शन के साथ निरस्त करने की कोशिश की है और imap बंद करें लेकिन यह काम नहीं कर रहा है।

मेरे कोड:

अजाक्स:

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

}); 

पीएचपी:

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 कैसे बंद करूं ताकि पृष्ठ तुरंत पुनः लोड हो सके?

+0

क्या आपके पास कोई इमेप लॉग है जो आप देख सकते हैं कि आप यह देखने के लिए ताज़ा हैं कि यह कनेक्शन बंद कर रहा है या नहीं? आमतौर पर ऐसा लगता है कि आपको इस बिंदु पर कोड पर इमेप ट्यूनिंग पर काम करने की आवश्यकता है। – mkaatman

+0

सत्र लॉक का कोई मुद्दा हो सकता है; – itzmukeshy7

उत्तर

1

यदि मैं सही ढंग से समझ गया, तो समय लेने वाला कोड foreach() लूप के भीतर स्थित है।

अब

, भले ही आप IMAP सत्र को मारने के लिए एक दूसरे अनुरोध करते हैं, जब तक या तो इसे खत्म या यदि (और जब) निष्पादन समय अपने max_execution_time सेटिंग से अधिक है पीएचपी यह मारता है कि foreach() पाश जारी रहेगा।

किसी भी मामले में, आपको अपने foreach() लूप के भीतर कुछ चाहिए जो प्रत्येक राउंड को रद्द करने की स्थिति में पूरा हो जाएगा, ताकि स्विफ्टफ्लाई वर्तमान अनुरोध को समाप्त कर सके और ग्राहक को नया बनाने की अनुमति दे।

मेरा सुझाव है कि आप PHP फ़ंक्शन connection_aborted() देखें, कि क्लाइंट वर्तमान अनुरोध को बंद करने के बाद आप इसका पता लगाने के लिए उपयोग कर सकते हैं, और आमतौर पर आप connection handling के विषय पर पढ़ सकते हैं ताकि कनेक्शन और अनुरोध कैसे बेहतर हो सकें PHP में संभाला

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 स्क्रिप्ट के लिए कहते हैं। और यह आपके लूप को तोड़ देगा और फ़ाइल को हटा देगा।

संबंधित मुद्दे