2011-08-24 15 views
6

में PHP फ्लश फ्लशिंग बंद कर दिया गया है हम PHP के फ्लश का उपयोग तुरंत उसी पृष्ठ पर "रिक्त" करने के लिए कर रहे हैं जैसे ही क्लिक किया गया है, और पेज के नेविगेशन और मुख्य घटकों को भी भेजने के लिए ताकि एक पृष्ठ लगभग तुरंत दिखाई दे , भले ही सामग्री को लोड करने में लंबा समय लगे।आईआईएस 7.5

यह बहुत अच्छी तरह से काम कर रहा है।

हाल ही में हमने आईआईएस 7.0 से 7.5 तक अपग्रेड किया और अब फ्लश काम नहीं करता है। समस्या की जांच करते समय हमने स्थिर और गतिशील दोनों फ़ाइलों के लिए संपीड़न बंद कर दिया है। हमने आउटपुट कैशिंग भी बंद कर दिया है।

हमारे पास zlib संपीड़न बंद है और php.ini में आउटपुट बफरिंग है।

आदेश समस्या हम निम्न स्क्रिप्ट

@ini_set("output_buffering", "Off"); 
@ini_set('implicit_flush', 1); 
@ini_set('zlib.output_compression', 0); 

ob_start(); 

echo "starting...<br/>\n"; 
for($i = 0; $i < 5; $i++) { 
    print "$i<br/>\n"; 
    ob_end_flush(); 
    ob_flush(); 
    flush(); 
    ob_start(); 
    sleep(2); 
} 
print "DONE!<br/>\n"; 

ब्राउज़र सिर्फ लोड हो रहा है स्थिति (जो कुछ भी है कि किसी भी ब्राउज़र में है पता चलता है का परीक्षण करने के लिए, IE में यह एक अजाक्स ऐनिमेटेड gif की तरह दिखता है, फ़ायरफ़ॉक्स में टैब "कनेक्टिंग ..." कहेंगे) 10 सेकंड के लिए, और फिर अचानक पूरा आउटपुट दिखाई देता है।

हमने इस साइट पर समान प्रश्नों के आधार पर फ्लश और ob_flush और ob_end_flush के विभिन्न संयोजनों का प्रयास किया है। उनमें से कोई भी काम नहीं करता है। आईआईएस/PHP डेटा को फ्लश करने का कोई तरीका है?

function flush_buffers(){ 
    ob_end_flush(); 
    ob_flush(); 
    flush(); 
    ob_start(); 
} 
अपने कोड में

तो:

ob_start(); 
flush_buffers(); 

echo "starting...<br/>\n"; 
for($i = 0; $i < 5; $i++) { 
    print "$i<br/>\n"; 
    flush_buffers(); 
    sleep(2); 
} 

यह :-)


यहाँ है दोषरहित काम करना चाहिए

उत्तर

7

आप एक नंबर के लिए पर्याप्त करने के लिए वास्तव में फ्लश कम करने के लिए वांछित हैंडलर के ResponseBufferLimit मूल्य सेट करना होगा। मैं 0 का उपयोग करने की अनुशंसा करता हूं क्योंकि यह आईआईएस को कुछ भी करने से रोकता है लेकिन आप इसे अपनी PHP स्क्रिप्ट से भेजते हैं। आप निम्न कमांड लाइन ResponseBufferLimit सेट करने के लिए 0 करने के लिए php हैंडलर के लिए उपयोग कर सकते हैं (बस "NAME" को आप जैसे PHP53_via_FastCGI अद्यतन करना चाहते हैंडलर के नाम करने के लिए बदल): वैकल्पिक रूप से

appcmd.exe set config /section:handlers "/[name='NAME'].ResponseBufferLimit:0" 

, आप संपादित कर सकते हैं applicationHost.config सीधे और एक प्रतिक्रिया BufferLimit एक्सएमएल तत्व विशेषताएँ जोड़ें।

3

मैं क्या है कि मैं निम्नलिखित समारोह का उपयोग करें कुछ कामकाजी कोड (सही Content-Type सेट के साथ):
DEMO
CODE

<?php 
header("Content-Type: text/html; charset=utf-8"); 
function flush_buffers(){ 
    ob_end_flush(); 
    ob_flush(); 
    flush(); 
    ob_start(); 
} 

ob_start(); 
flush_buffers(); 
echo "starting...<br/>\n"; 
for($i = 0; $i < 60; $i++) { 
    flush_buffers(); 
    print "$i<br/>\n"; 
    flush_buffers(); 
    sleep(2); 
} 

flush_buffers(); 

print "DONE!<br/>\n"; 
?> 
+0

यह काम किया। यह देखने के लिए टुकड़े से अलग टुकड़ा लेना कि कौन सा कुंजी है ... –

+0

@ जेफ, डेमो को थोड़ा सा मदद चाहिए :-) – Neal

+1

ऐसा लगता है कि कुंजी सामग्री प्रकार है: टेक्स्ट/एचटीएमएल; charset = utf-8। इसे हेडर के रूप में जोड़ना भी काम करता है। विशेष रूप से ऐसा लगता है कि charset = utf-8 यह काम करता है। –

1

यह वेब सर्वर है कि क्या यह सामग्री naggle या chunked एन्कोडिंग के माध्यम से भेज करने का फैसला करता पर निर्भर है। तो हालांकि PHP क्लाइंट को डेटा धक्का देने के लिए सर्वर से पूछ सकता है, यह सर्वर को चंकित एन्कोडिंग का उपयोग करने के लिए मजबूर नहीं कर सकता है।

This article पता चलता है कि आप स्पष्ट रूप आईआईएस के लिए स्थानांतरण एन्कोडिंग सेट सर्वर से डेटा भेजने के लिए (ISAPI के बारे में थोड़ा और देखें) करने की जरूरत है - आप अपनी स्क्रिप्ट में एक ही कोशिश कर सकते हैं।

IME, जहां यह कोई मुद्दा बेहतर के साथ द्वारा ....

register_shutdown_function('do_slow_stuff'); 
....generate html content.... 
exit; // closes stdin/stdout, but shutdown fn will still be called 

function do_slow_stuff() 
{ 
    .... 
} 
4

PowerShell में प्रशासक के रूप में निम्न आदेश डालें निपटा जा सकता है है सबसे परिदृश्यों:

C:\Windows\System32\inetsrv> .\appcmd.exe set config /section:handlers "/[name='PHP_via_FastCGI'].ResponseBufferLimit:0" 

अपेक्षित आउटपुट:

एप्लाइड कॉन्फ़िगरेशन अनुभाग "सिस्टम में परिवर्तन।http://www.coastrd.com/cgioniis7

असल में, हम की जरूरत है: वेबसर्वर/संचालकों मशीन/WEBROOT/APPHOST "के लिए " मशीन/WEBROOT/APPHOST "

अधिक पृष्ठभूमि के लिए," विन्यास कॉम यह पथ पर "पर एक नजर है (जाँच की केवल 7.5) अपने ResponseBufferLimit की बारी करने के FastCGI बताने के लिए यह आईआईएस प्रबंधन कंसोल के माध्यम से नहीं किया जा सकता

23

वहाँ रिस्पांस सीमा आईआईएस प्रबंधक का उपयोग कर स्थापित करने के लिए एक और तरीका है:।

  1. सर्वर मुख्य पृष्ठ पर, "प्रबंधन" के अंतर्गत, "कॉन्फ़िगरेशन संपादक" का चयन करें;
  2. "धारा" के अंतर्गत, 'system.webServer/संचालकों' प्रवेश करते हैं;
  3. बगल में स्थित "(संग्रह)" क्लिक "..." या तत्व का प्रतीक "(संग्रह)" और, "कार्रवाई" und '(संग्रह)' तत्व के तहत, क्लिक करें "संपादित करें आइटम";
  4. तब तक नीचे स्क्रॉल करें जब तक आपको अपना नाम "नाम" के अंतर्गत नहीं मिलता है;
  5. तल पर, गुण दिखाए जाते हैं एक मैन्युअल रूप से संपादित किया जा सकता responseBufferLimit, जो फ्लश() काम करने के लिए 0 पर सेट किया जाना चाहिए भी शामिल है।

बड़ा प्रो यह है कि आप सब कुछ के लिए गुणों को संपादित कर सकते हैं, न केवल PHP प्लस आप PHP के विभिन्न संस्करणों (या उसी संस्करण के इंस्टॉलेशन) के साथ भी काम कर सकते हैं।

HTH

+2

+1 उत्कृष्ट! यह पहली बार है जब मैंने आईआईएस मैनेजर के माध्यम से प्रतिक्रियाबफरलिमिट स्थापित करने का समाधान देखा है। – Rich

+0

यह एक सबसे अच्छा दक्षिण है। धन्यवाद –

2

मैं पार्टी के लिए एक छोटे से देर हो रही है, लेकिन सोचा था कि मैं कैसे web.config के साथ ऐसा करने के लिए जोड़ होगा।

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
     <!--- other stuff here ---> 
     <handlers> 
      <remove name="ISAPI-dll" /> 
      <add name="ISAPI-dll" path="*.dll" verb="*" type="" modules="IsapiModule" scriptProcessor="" resourceType="File" requireAccess="Execute" allowPathInfo="true" preCondition="" responseBufferLimit="0" /> 
     </handlers> 
    </system.webServer> 
</configuration> 
0

यहाँ (@ जूल्स के विधि आईआईएस 8.0 के साथ मेरे लिए काम नहीं किया था) web.config के साथ ऐसा करने का एक और तरीका है। बेशक, आप वास्तव में अपनी मशीन पर PHP संस्करणों और पथों को प्रतिस्थापित करना चाहते हैं।

इस सर्वर से भेजा घटनाओं के उपयोग की अनुमति देता है!

<configuration> 
    <system.webServer> 
     <handlers> 
      <remove name="PHP53_via_FastCGI" /> 
      <remove name="PHP54_via_FastCGI" /> 
      <remove name="PHP55_via_FastCGI" /> 
      <add name="PHP53_via_FastCGI" path="*.php" verb="GET,HEAD,POST" type="" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.3\php-cgi.exe" resourceType="Either" requireAccess="Script" allowPathInfo="true" preCondition="" responseBufferLimit="0" /> 
      <add name="PHP54_via_FastCGI" path="*.php" verb="GET,HEAD,POST" type="" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.4\php-cgi.exe" resourceType="Either" requireAccess="Script" allowPathInfo="true" preCondition="" responseBufferLimit="0" /> 
      <add name="PHP55_via_FastCGI" path="*.php" verb="GET,HEAD,POST" type="" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.5\php-cgi.exe" resourceType="Either" requireAccess="Script" allowPathInfo="true" preCondition="" responseBufferLimit="0" /> 
     </handlers> 
    </system.webServer> 
</configuration> 
संबंधित मुद्दे