2010-07-07 15 views
5

मैं सीजीआई में फ़ाइल अपलोड के लाइव पार्सिंग प्रदान करने की कोशिश कर रहा हूं और अपलोड होने के बाद स्क्रीन पर डेटा दिखा रहा हूं।अपाचे 2 और सीजीआई - अपाचे को पोस्ट डेटा को बफर करने से कैसे रोकें?

हालांकि, अपाचे 2 सीजीआई एप्लिकेशन को कुछ भी भेजने से पहले पूरा पोस्ट पूरा करने के लिए इंतजार करना चाहता है।

मैं अपने सीजीआई एप्लिकेशन में पोस्ट को बफर करने से रोकने के लिए अपाचे 2 को कैसे मजबूर कर सकता हूं?

संपादित

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

1) आउटपुट buffered किया जा रहा है। मैंने सफलता के बिना "! Nogzip", "nogzip", और "! Gzip" के लिए SetEnvIf (और बस SetEnv) की कोशिश की है (CGI निर्देशिका परिभाषा के भीतर)।

2) सीपीआई प्रक्रिया समाप्त होने तक अपाचे 2 सीजीआई के आउटपुट को नहीं पढ़ रहा है? मैंने देखा है कि मेरा CGI ऐप (फ्लशिंग या नहीं) लगभग 80K पर "fwrite (..., stdout)" लाइन पर स्थायी रूप से लटक रहा है।

संपादित

ठीक है, फ़ायरफ़ॉक्स मेरे साथ खिलवाड़ कर रहा है। अगर मैं 150 के फाइल भेजता हूं, तो 80 के आसपास कोई सीजीआई लॉकअप नहीं है। अगर फ़ाइल 2 जी है, तो एक लॉकअप है। इसलिए, फ़ायरफ़ॉक्स सर्वर से आउटपुट नहीं पढ़ रहा है, जबकि वह फ़ाइल भेजने की कोशिश कर रहा है ... क्या उस व्यवहार को बदलने के लिए कोई हेडर या वैकल्पिक सामग्री प्रकार है?

संपादित

ठीक है, मुझे लगता है कि बड़ी फ़ाइलों पर सीजीआई उत्पादन लॉकअप वास्तव में महत्वपूर्ण नहीं है। मुझे फाइल गूंजने की जरूरत नहीं है! मैं डिबगिंग एड्स के कारण किसी समस्या को डीबग कर रहा हूं। :)

मुझे लगता है कि यह तब काफी अच्छा काम करता है। धन्यवाद!

अंतिम नोट

बस एक नोट ... कारण मैंने सोचा था कि Apache2 बफरिंग था इनपुट था कि मैं हमेशा एक "सामग्री-लंबाई" वातावरण चर मिल गया के रूप में। मुझे लगता है कि फ़ायरफ़ॉक्स एक मल्टीपार्ट फॉर्म अपलोड की सामग्री लंबाई को सटीक करने के लिए पर्याप्त स्मार्ट है और अपाचे 2 इसे पास कर रहा था। मैंने सोचा कि Apache2 इनपुट को बफर कर रहा था और लंबाई की रिपोर्टिंग कर रहा था।

उत्तर

3

क्या आप वाकई इनपुट कर रहे हैं कि यह समस्या है? आउटपुट बफरिंग समस्याएं अधिक आम हैं, और इनपुट बफरिंग से भिन्न नहीं हो सकती हैं, अगर आपकी डिबगिंग की विधि प्रतिक्रिया के लिए print की तरह कुछ है।

(आउटपुट बफरिंग सामान्यतः unflushed stdout लिपि में या फिल्टर करके या तो कारण होता है। हमेशा की तरह अपराधी DEFLATE फिल्टर, जो अक्सर सभी text/ प्रतिक्रियाओं संपीड़ित करने के लिए, चाहे वे एक स्थिर फ़ाइल या एक स्क्रिप्ट से आते हैं प्रयोग किया जाता है। आम तौर पर स्क्रिप्ट के आउटपुट को संपीड़ित करना एक अच्छा विचार है, लेकिन एक दुष्प्रभाव यह है कि इससे प्रतिक्रिया पूरी तरह से बफर हो जाएगी। अगर आपको तत्काल प्रतिक्रिया की आवश्यकता है, तो आपको इसे एक स्क्रिप्ट या सभी के लिए बंद करना होगा स्क्रिप्ट, विशेष <Directory> रों को AddOutputFilterByType के आवेदन सीमित, या !nogzip टिप्पणी स्थापित करने के लिए mod_setenvif का उपयोग करके।)

इसी तरह, एक इनपुट च इल्टर (सहित, DEFLATE) यदि आप किसी का उपयोग कर रहे हैं, तो सीजीआई इनपुट को बफर किया जा सकता है। लेकिन वे कम व्यापक रूप से उपयोग किया जाता है।

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

मुझे पता है कि मेरा CGI ऐप (फ्लशिंग या नहीं) लगभग 80K पर "fwrite (..., stdout)" लाइन पर स्थायी रूप से लटक रहा है।

हाँ ... यदि आपने अपना सभी इनपुट नहीं पढ़ा है, तो आप आउटपुट लिखने की कोशिश करते समय डेडलॉक कर सकते हैं, अगर आप बहुत अधिक लिखते हैं। आप आउटपुट कॉल पर अवरुद्ध कर सकते हैं, नेटवर्क बफर को अनजान करने की प्रतीक्षा कर रहे हैं ताकि आप जो नया डेटा प्राप्त कर सकें, वह कभी भी नहीं भेज सके, लेकिन वे कभी भी ऐसा नहीं करेंगे क्योंकि ब्राउज़र आउटपुट पढ़ने से पहले अपने सभी डेटा भेजने की कोशिश कर रहा है।

आप यहां क्या काम कर रहे हैं? आम तौर पर प्रत्यक्ष रूप से पोस्ट के जवाब में प्रगति-सूचना आउटपुट लिखना समझ में नहीं आता है, क्योंकि ब्राउज़र आमतौर पर इसे प्रदर्शित नहीं करेंगे। यदि आप एक सादे एचटीएमएल फॉर्म सबमिशन पर अपलोड-प्रगति फीडबैक प्रदान करना चाहते हैं, तो यह आम तौर पर हैक के साथ किया जाता है जैसे AJAX कनेक्शन जांचने के लिए यह देखने के लिए कि अपलोड कैसे चल रहा है (जिसका अर्थ है प्रगति जानकारी साझा की जानी चाहिए, उदाहरण के लिए डेटाबेस में), या एक फ्लैश अपलोड घटक का उपयोग कर।

+0

मैं बहुत सफलता के बिना! Nogzip लाइन की कोशिश कर रहा हूँ। जैसा कि ऊपर बताया गया है, अब भी मुझे स्टडआउट आउटपुट समस्या है। – darron

+0

चूंकि यह सब के बाद आउटपुट समस्या थी, और डिफ्लेट जानकारी काफी उपयोगी है, मैं इसे उत्तर में चिह्नित कर रहा हूं। – darron

+0

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

0

एक (पुराना संस्करण) से अपाचे HTTP सर्वर मैनुअल के:

हर बार अपनी स्क्रिप्ट एक "फ्लश" को आउटपुट डेटा करता है, कि डेटा ग्राहक के लिए पर प्रसारित हो जाता है। कुछ स्क्रिप्टिंग भाषाएं, उदाहरण के लिए पर्ल, आउटपुट के लिए अपने स्वयं के बफरिंग हैं - यह $ को सेट करके अक्षम किया जा सकता है। विशेष चर 1. तक यह पैकेट प्रसारित होने की कुल संख्या में वृद्धि करता है, जो अंतिम उपयोगकर्ता के लिए धीमेपन की भावना में परिणाम दे सकता है।

आप STDOUT निस्तब्धता या जाँच भाषा का प्रयोग कर रहे बफरिंग आप निष्क्रिय कर सकते हैं अगर कोशिश की है?

+0

हां, मैं 8 के अंतराल पर STDOUT फ़्लश कर रहा हूं ... कोई स्पष्ट प्रभाव नहीं। – darron

0

यहाँ बफरिंग को नियंत्रित जब सर्वर साइड पर पर्ल प्रयोग करने के लिए एक उपयोगी मार्गदर्शिका है:

http://perl.plover.com/FAQs/Buffering.html

विचारों और अवधारणाओं के कई तरह के रूप में भी अन्य भाषाओं के लिए लागू होते हैं, बफ़र और unbuffered उत्पादन, कच्चे प्रणाली का उपयोग डेटा बनाम I/O पुस्तकालयों को पढ़ने और लिखने के लिए कॉल करता है जो अपना स्वयं का बफरिंग करते हैं।

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