Mod_fcgid उपयोगकर्ताओं के लिए ध्यान दें (कृपया, अपने जोखिम पर उपयोग करें)।
त्वरित समाधान
जोएरी सेब्रेट्स का स्वीकृत उत्तर वास्तव में कार्यात्मक है। हालाँकि, यदि आप mod_fcgid का उपयोग करते हैं, तो आप पा सकते हैं कि यह समाधान अपने आप काम नहीं करता है। दूसरे शब्दों में, जब फ्लश फ़ंक्शन को कहा जाता है तो क्लाइंट का कनेक्शन बंद नहीं होता है।
FcgidOutputBufferSize
के विन्यास पैरामीटर mod_fcgid दोष करने के लिए हो सकता है। मुझे यह टिप मिली है:
- ट्रैवर्स कार्टर का यह उत्तर और
- Seumas Mackinnon की यह ब्लॉग पोस्ट ।
उपरोक्त पढ़ने के बाद, आप इस निष्कर्ष पर आ सकते हैं कि लाइन को जोड़ने के लिए एक त्वरित समाधान होगा (अंत में "उदाहरण वर्चुअल होस्ट देखें"):
FcgidOutputBufferSize 0
आपकी अपाचे कॉन्फ़िगरेशन फ़ाइल (जैसे, httpd.conf), आपकी FCGI कॉन्फ़िगरेशन फ़ाइल (जैसे, fcgid.conf) या आपकी वर्चुअल होस्ट फ़ाइल (जैसे, httpd-vhosts.conf) में।
ऊपर (1) में, "OutputBufferSize" नामक एक चर का उल्लेख किया गया है। यह FcgidOutputBufferSize
उल्लिखित (2) में पुराना नाम है ( mod_fcgid के लिए अपाचे वेब पेज में उन्नयन नोट देखें )।
विवरण और दूसरा समाधान
उपरोक्त समाधान mod_fcgid द्वारा निष्पादित बफरिंग को निष्क्रिय कर देता है या तो पूरे सर्वर के लिए या किसी विशिष्ट वर्चुअल होस्ट के लिए करता है। यह आपकी वेब साइट के लिए एक प्रदर्शन जुर्माना हो सकता है। दूसरी ओर, यह अच्छी तरह से मामला नहीं हो सकता है क्योंकि PHP अपने दम पर बफरिंग करता है।
यदि आप mod_fcgid की बफरिंग को अक्षम नहीं करना चाहते हैं तो एक और उपाय है ... आप इस बफर को फ्लश करने के लिए मजबूर कर सकते हैं ।
नीचे दिए गए कोड जोरी सेब्रेट्स द्वारा प्रस्तावित समाधान पर निर्माण करके ऐसा करते हैं:
<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // just to be safe
ob_start();
echo('Text the user will see');
echo(str_repeat(' ', 65537)); // [+] Line added: Fill up mod_fcgi's buffer.
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // Strange behaviour, will not work
flush(); // Unless both are called !
// Do processing here
sleep(30);
echo('Text user will never see');
?>
कोड की अतिरिक्त पंक्ति अनिवार्य रूप से mod_fcgi के बफर को भरती है , इस प्रकार इसे फ्लश करने के लिए मजबूर करती है। संख्या "65537" को चुना गया क्योंकि FcgidOutputBufferSize
चर का डिफ़ॉल्ट मान "65536" है, जैसा कि संबंधित निर्देश के लिए अपाचे वेब पेज में उल्लेख किया गया है । इसलिए, यदि आपके वातावरण में कोई अन्य मान सेट है, तो आपको इस मान को समायोजित करने की आवश्यकता हो सकती है।
मेरा पर्यावरण
- वैंपसर 2.5
- अपाचे 2.4.9
- PHP 5.5.19 VC11, x86, नॉन थ्रेड सेफ
- mod_fcgid / 2.3.9
- विंडोज 7 प्रोफेशनल x64
उदाहरण वर्चुअल होस्ट
<VirtualHost *:80>
DocumentRoot "d:/wamp/www/example"
ServerName example.local
FcgidOutputBufferSize 0
<Directory "d:/wamp/www/example">
Require all granted
</Directory>
</VirtualHost>