2010-10-21 6 views
5

से XMLHttpRequest प्रगति प्राप्त करना मैं एक PHP स्क्रिप्ट के लिए XMLHttpRequest चलाने के लिए जावास्क्रिप्ट का उपयोग कर रहा हूं जो डेटा देता है। असल में मैं उपयोगकर्ता को प्रगति पट्टी (एक कताई चक्र या कुछ के बजाय) प्रदान करने में सक्षम होना चाहता हूं जो डेटा प्राप्त करने और प्राप्त करने की प्रगति दिखाता है। मुझे पता है कि मुझे फ़ाइल मिल रही है, मैं सिर्फ सामग्री लंबाई शीर्षलेख की जांच कर सकता हूं और इसका उपयोग कर सकता हूं, लेकिन एक स्क्रिप्ट के मामले में, आप नहीं जानते कि यह कितना डेटा पुनर्प्राप्त कर रहा है।PHP स्क्रिप्ट

इसका उत्तर जितना आसान हो सकता है, "यह संभव नहीं है," क्योंकि अभी यह ऐसा लगता है। लेकिन निष्कर्ष में: आप एक चल रहे स्क्रिप्ट (PHP) और XMLHttpRequest की प्रगति की निगरानी कैसे करते हैं?

+0

ऐसा करने के लिए एक दर्जन अलग-अलग तरीके हो सकते हैं। यह इस बात पर निर्भर करता है कि PHP स्क्रिप्ट क्या कर रही है, और आपके पास किस प्रकार की सर्वर साइड तकनीक है। क्या आप अधिक विशिष्ट हो सकते हैं? – mellowsoon

+0

स्क्रिप्ट क्वेरी चल रहा है और एचटीएमएल कोड उत्पन्न करने के लिए डेटा का उपयोग कर रहा है, जो वर्तमान पृष्ठ पर xmlhttprequest प्रतिक्रिया हैंडलर सम्मिलित करता है। – Evan4623

उत्तर

1

मेरे सिर के ऊपर से आप 2 AJAX अनुरोधों का उपयोग कर सकते हैं। एक नौकरी शुरू करने के लिए शुरू करने और इंतजार करने के लिए, और नौकरी की प्रगति की जांच करने के लिए एक और। मुझे पूरा यकीन है कि अधिकांश ब्राउज़र एक समय में कम से कम 2 AJAX अनुरोध कर सकते हैं।

PHP स्क्रिप्ट (इसे इसे job.php कहते हैं) जो वास्तव में नौकरी कर रहा है, सत्र पूर्ण होने के प्रतिशत के साथ सत्र परिवर्तनीय $ _SESSION ['job_progress'] अपडेट कर सकता है।

आप किसी अन्य PHP स्क्रिप्ट जो वह मान echos (यह progress.php फोन की सुविधा देता है), अर्थात

<?php echo $_SESSION['job_progress']; 

क्लाइंट साइड आप job.php करने के लिए अपने ajax अनुरोध को वापस ले आग है। आपके पास प्रगति के लिए एक और AJAX अनुरोध है। Php जो हर 3 सेकंड चलाता है। आप अपनी प्रगति पट्टी को वापस मूल्य के साथ अपडेट करें।

यदि आप नौकरी समाप्त होने से पहले job.php रिटर्न का अनुरोध करते हैं तो आप इसे एक AJAX अनुरोध के साथ भी कर सकते हैं। फिर आप progress.php स्क्रिप्ट को पिंग करने के लिए एक एकल AJAX अनुरोध का उपयोग जारी रख सकते हैं।

+0

मुझे लगता है कि वह जानना चाहता है कि अब तक प्राप्त एक्सएचआर के साथ अनुरोध की गई फाइल के कितने बाइट्स हैं। – GordonM

+0

@ गॉर्डन - एक ही अवधारणा लागू होती है। – mellowsoon

+0

PHP किसी दिए गए कनेक्शन पर कितने बाइट्स भेजे गए हैं इसका रिकॉर्ड नहीं रखता है, इसलिए मैं वास्तव में समझ नहीं पा रहा हूं कि दूसरे कनेक्शन का उपयोग करने से यह मदद मिलेगी। यदि आप एक नौकरी निष्पादित करने में PHP सेट करना चाहते हैं जो चलाने में लंबा समय लगेगा, तो आप यह पूछने के लिए अपने समाधान का उपयोग कर सकते हैं कि नौकरी पूरी होने से पहले कितना समय लगता है, लेकिन नौकरी के मामले में जो बहुत जल्दी खत्म होता है लेकिन परिणाम इस दृष्टिकोण को भेजने के लिए बहुत सारे डेटा में इतना अच्छा काम नहीं करेगा। – GordonM

0

कुछ ब्राउज़रों (एक के लिए फ़ायरफ़ॉक्स) में, readyState 3 (यानी लोडिंग) के साथ पहले से हीस्टेन्चेंज को कई बार बुलाया जाता है ताकि डाउनलोड प्रगति की निगरानी की जा सके।

इसके अलावा, कुछ ब्राउज़रों में प्रतिक्रिया टेक्स्ट संपत्ति में परिणाम रिटर्न शामिल हैं, और प्रगति के बारे में कुछ विचार पाने के लिए इसकी जांच की जा सकती है।

हालांकि

, इंटरनेट एक्सप्लोरर (कम से कम IE7 के लिए, यकीन नहीं के बारे में बाद में) इस का समर्थन नहीं करता है, और यह responseText या responseBody readyState 3. के लिए मैं भी सुना है केवल आईई onreadystatechange एक बार कॉल क्वेरी करने के लिए एक त्रुटि है तैयार चरण 3 के साथ जो आपके उद्देश्य के लिए इसे बहुत बेकार बना देगा, लेकिन मैं इसका परीक्षण करने का सुझाव दूंगा।

0

एक सत्र बनाएं। (शायद, आपके पास पहले से ही एक है)। क्वेरी के लिए एक यूआईडी बनाएं, जब आप इसे प्रसंस्करण शुरू करने का अनुरोध करते हैं।

एसआईडी + यूआईडी के साथ सर्वर पर (डेटाबेस में, फ़ाइल में, आदि) पर कहीं भी स्टोर करें, क्योंकि क्वेरी प्रगति के रूप में है।

एसआईडी + यूआईडी द्वारा प्रगति के मतदान के लिए टाइमर के साथ दूसरा AJAX अनुरोध का उपयोग करें।

* आप केवल यूआईडी द्वारा प्राप्त कर सकते हैं, लेकिन मुझे यह अधिक प्रबंधनीय पाया गया है जब आप उपयोगकर्ता/सत्र द्वारा कार्यों की निगरानी भी कर सकते हैं।

2

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

मैंने इस कोड को कई वर्षों पहले एक्सएचआर ऑपरेशन में स्थानांतरित डेटा का प्रतिशत निर्धारित करने के लिए लिखा था, इसलिए मैं इसके लिए माफी माँगता हूं क्योंकि मैंने कोडिंग अनुभव के वर्षों को प्रतिबिंबित नहीं किया है। मैं लगभग निश्चित रूप से इसे इस तरह से नहीं लिखूंगा! फिर भी, मैं इसे मछली पकड़ने में कामयाब रहा, और उम्मीद है कि यह आपके लिए उपयोग की जाएगी।

जब यह लिखा गया था, आईई 7 एक्सप्लोरर का नवीनतम संस्करण उपलब्ध था, और मुझे याद है कि कोड उसमें काम नहीं करता है, इसलिए इसमें आईई के तहत प्रारंभ करने से रोकने के लिए कोड शामिल है। मैंने इस कोड को संस्करण 8 या संस्करण 9 के बीटा के तहत कभी भी कोशिश नहीं की है, और यह वास्तव में उन संस्करणों में भी काम कर सकता है, लेकिन मैं इसके लिए झुकाव नहीं कर सकता। यदि आप इसे IE के नए संस्करण में काम कर सकते हैं, तो कृपया मुझे बताएं!

यह जावास्क्रिप्ट अंतराल स्थापित करने के लिए पहले सेन्ड में कोड चलाने के द्वारा काम करता है (एक कॉलबैक jQuery जो कोड आप AJAX अनुरोध शुरू करने से पहले चलाने के लिए चाहते हैं) (कोड में मैंने 50 मिलीसेकंड लगाए हैं, जो शायद कहीं भी है अक्सर 200 मिलीसेकंड अभी भी पर्याप्त होना चाहिए, और सिस्टम पर कम तनाव डालना चाहिए)। प्रत्येक बार अंतराल टाइमर आग लगती है, यह एक फ़ंक्शन चलाती है जो प्रतिक्रिया को देखती है XHR अनुरोध की टेक्स्ट विशेषता। प्रतिक्रिया टेक्स्ट विशेषता में अब तक प्राप्त डेटा का कच्चा पाठ है। लंबाई() स्ट्रिंग विधि के साथ कितने वर्ण हैं, यह गिनकर, हम काम कर सकते हैं कि अब तक कितने बाइट एकत्र किए गए हैं।

जहां तक ​​कुल डेटा के प्रतिशत को भेजने के लिए काम करना है, इसके लिए यह आवश्यक होगा कि आपका सर्वर साइड कोड सामग्री-लंबाई वाले शीर्षलेख को सटीक गिनती के साथ भेजता है कि यह कितने बाइट भेजने जा रहा है। इसके लिए आपके हिस्से पर थोड़ी चतुरता की आवश्यकता होगी, लेकिन यह बहुत मुश्किल साबित नहीं होना चाहिए। यदि आप एक सटीक सामग्री-लंबाई शीर्षलेख भेजते हैं, तो इसका उपयोग अब तक प्राप्त डेटा के प्रतिशत की गणना करने के लिए किया जाता है। यदि आप कोई सामग्री शीर्षलेख सेट नहीं करते हैं, तो इसके बजाय प्राप्त डेटा की मात्रा को इसके बजाय प्रदर्शित किया जाता है।

<script type="text/javascript"> 
$.ajax ({ 
    beforeSend : function (thisXHR) 
    { 
     // IE doesn't support responseText access in interactive mode 
     if (!$.browser.msie) 
     { 
      myTrigger = setInterval (function() 
      { 
       if (thisXHR.readyState > 2) 
       // When there is partial data available use it to determine how much of the document is downloaded 
       { 
        var dlBytes = thisXHR.responseText.length; 
        if (totalBytes == -1) 
         totalBytes = thisXHR.getResponseHeader ('Content-length'); 
        (totalBytes > 0)? 
         $('#progress').html (Math.round ((dlBytes/totalBytes) * 100) + "%"): 
         $('#progress').html (Math.round (dlBytes/1024) + "K"); 
       } 
      }, 50); // Check the status every 50 miliseconds 
     } 
    }, 
    complete : function() 
    { 
     // Kill the download progress polling timer 
     if (myTrigger) 
      clearInterval (myTrigger); 
    } 
}); 
</script>