2010-08-13 20 views
7

मैं एक PHP स्क्रिप्ट पर काम कर रहा हूं जो अग्रिम लंबाई को जानने के बिना फ्लाई पर बड़े (बहु-एमबी) आउटपुट उत्पन्न करता है। मैं सीधे php://output पर fwrite() के माध्यम से लिख रहा हूं और मानक आउटपुट और Transfer-Encoding: chunked (आवश्यकतानुसार भाग को एन्कोड करना) का उपयोग करने की कोशिश की है, लेकिन इससे कोई फर्क नहीं पड़ता कि ब्राउज़र डाउनलोड करने का प्रयास करता है जब तक कि डाउनलोड संवाद प्रदर्शित करने से पहले सभी डेटा लिखे जाएं। मैंने हेडर के बाद और प्रत्येक खंड के बाद flush() आईएनजी भी कोशिश की है लेकिन इससे कोई फर्क नहीं पड़ता है।अपाचे/PHP आउटपुट कैशिंग

मुझे लगता है कि अपाचे आउटपुट को कैशिंग कर रहा है क्योंकि ब्राउज़र सामान्य रूप से सर्वर से कुछ केबी प्राप्त करने के बाद प्रदर्शित होता है।

क्या किसी के पास इस कैशिंग को रोकने और ब्राउजर को डेटा को फ्लैश करने के बारे में कोई विचार है?

धन्यवाद, जम्मू

+1

अनुमान लगाने के बजाय कि पूरी सामग्री उत्पन्न होने तक अपाचे फ्लश नहीं कर रहा है, मैं सुझाव देता हूं कि वायरसहार्क या इसी तरह के टूल्स का उपयोग _see_ ब्राउज़र पर कौन सा डेटा भेजा जा रहा है। यदि आपको चीजों को धीमा करने की आवश्यकता है तो कुछ 'नींद (1)' कॉल डालें। (मुझे संदेह है कि अपाचे अपने बफर को फ्लश करने से पहले एक सॉकेट पर कई मेगाबाइट रखता है।) – sarnold

+3

मेरा अनुमान होगा कि आपके पास gpip संपीड़न या तो php.ini और/या apache config में सक्षम है। उस मामले में अपाचे हमेशा कैश करता है। इस से बचने के लिए कोई रास्ता नहीं मिला है (संपीड़न को अक्षम करने के अलावा), तो देखते हैं कि अन्य लोगों को इसके बारे में क्या पता है। Serverfault.com के लिए एक सवाल हो सकता है, हालांकि ... – BlaM

+0

@ कर्नाल्ड - जब मैं कहता हूं कि मैं अनुमान लगा रहा हूं कि यह एक शिक्षित अनुमान है क्योंकि मैं फिडलर के माध्यम से अनुरोध को ट्रैक कर रहा हूं और डाउनलोड संवाद प्रकट होने तक कोई प्रतिक्रिया नहीं दिखता इसलिए मुझे पूरा भरोसा है कि यह सर्वर की तरफ कैशिंग है। @BlaM - आप यह कहकर बिल्कुल सही हैं कि जीजेआईपी सक्षम है, मैंने इसे संभावित कारण के रूप में नहीं सोचा क्योंकि यह एक स्ट्रीमिंग संपीड़न है लेकिन यह समस्या हो सकती है। मैं इस विशेष लिपि के लिए अक्षम करने की कोशिश करूंगा और देखें कि क्या होता है। धन्यवाद। – JWood

उत्तर

1

सबसे पहले, Blam की तरह अपने टिप्पणी में उल्लेख किया है, PHP विन्यास OutputBuffering में यदि सक्षम किया गया है, यह अभ्यस्त काम करते हैं, तो यह आपके phpinfo पता करने के लिए उपयोगी होगा()।

अगला बात, कोशिश करें कि यह एक बड़ी फ़ाइल के साथ काम करता है जो यार वेबसर्वर पर संग्रहीत है, आउटपुट इसे usinf readfile आउटपुट करें। और, इसके साथ, जांचें कि क्या आप सही शीर्षलेख भेजते हैं। StackOverflow: How to force a file download in PHP

और जब आप इसे पर हैं, अपनी स्क्रिप्ट के शीर्ष पर ob_end_flush() या ob_end_clean() फोन: कैसे readfile करने के लिए() और सही हेडर एक यहाँ प्रदान भेजने पर संकेत।

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