2011-07-14 16 views
6

क्लाइंट ब्राउज़र बंद कर देता है (तो सर्वर से कनेक्शन) तो यह डमी स्क्रिप्ट क्यों चलती है?PHP स्क्रिप्ट ब्राउज़र से बाहर निकलने से बाहर नहीं निकलता

 
while (true) 
{ 
    sleep(1); 
    file_put_contents('/tmp/foo' , "I'm alive ".getmypid()."\n" , FILE_APPEND); 
} 

this के अनुसार यह मेरे लिए अप्रत्याशित है। this उदाहरण भी काम नहीं कर रहा है।

और set_time_limit गैर-शून्य पैरामीटर के साथ बस कुछ भी नहीं करता है।

मुझे कुछ स्पष्टीकरण चाहिए।

+0

आप ग्राहक को किसी भी तरह का आउटपुट नहीं करते समय उपयोगकर्ता निरस्त कर रहे हैं। – hakre

उत्तर

9

यदि आप उस लूप में ब्राउज़र पर कुछ आउटपुट लिखने का प्रयास करते हैं, तो कनेक्शन समाप्त होने पर आपको स्क्रिप्ट aborts मिलना चाहिए। यह व्यवहार के लिए ignore_user_abort

एक कमांड लाइन स्क्रिप्ट के रूप में पीएचपी चल रहा जब दस्तावेज में की ओर संकेत किया है, और स्क्रिप्ट के tty स्क्रिप्ट समाप्त किया जा रहा बिना दूर चला जाता है तो स्क्रिप्ट अगली बार इसे लिखने की कोशिश करता है मर जाएगा कुछ भी, जब तक कि मान TRUE

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

यहाँ एक उदाहरण है ...

//ensure we're not ignoring aborts.. 
ignore_user_abort(false); 

//find out how big the output buffer is 
$buffersize=max(1, ini_get('output_buffering')); 


while (true) 
{ 
    sleep(1); 

    //ensure we fill the output buffer - if the user has aborted, then the script 
    //will get aborted here 
    echo str_repeat('*', $buffersize)."\n"; 

    file_put_contents('/tmp/foo' , "I'm alive ".getmypid()."\n" , FILE_APPEND); 
} 

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

+0

कोशिश की, वही व्यवहार। – cYrus

+0

@cyrus: आपने क्या प्रयास किया है। कृपया अपने प्रश्न कोड में प्रतिबिंबित करें। आपको उपयोगकर्ता निरस्त करने को अनदेखा करने की आवश्यकता है। आईआईआरसी पर डिफ़ॉल्ट सेटिंग है। – hakre

+0

@ पॉल: क्या आप कामकाजी कोड प्रदान कर सकते हैं? – cYrus

1

set_time_limit केवल PHP कोड में बिताए गए समय को प्रतिबंधित करता है। आपके कार्यक्रम में अधिकांश समय (मुझे लगता है> 99.9%) सिस्टम कॉल में खर्च किया जाता है, फाइल को डेटा लिख ​​रहा है और सो रहा है।

ignore_user_abort केवल रोकता है जब आप (एक स्थानीय फ़ाइल में नहीं) ग्राहक के लिए कुछ लिख रहे हैं - वहाँ बस कोई रास्ता नहीं आप टीसीपी में अन्यथा एक अप्रयुक्त और एक समाप्त कनेक्शन भेद कर सकते हैं, जब तक ग्राहक excplicitely कनेक्शन समाप्त हो जाता है एक आरएसटी पैकेट के साथ।

+0

जो 'set_time_limit' बताता है, कुछ लिखना कोई बदलाव नहीं करता है। – cYrus

+0

उपयोगकर्ता आउटिंग सेंसिंग आईआईआरसी को ट्रिगर करने के लिए * आउटपुट * की आवश्यकता है। - http: //www.php।नेट/मैनुअल/एन/फीचर्स.कनेक्शन-हैंडलिंग.एफ़पी – hakre

+0

@ हकर हां, निश्चित रूप से यादृच्छिक स्थानीय फाइलों का टीसीपी कनेक्शन पर कोई प्रभाव नहीं पड़ता है। अपडेट किया गया। – phihag