दिलचस्प पोस्ट
निर्भरता इंजेक्शन और मॉकिंग फ्रेमवर्क के बीच अंतर (Ninject बनाम राइनोमॉक या मूक) एक सरणी से बेतरतीब ढंग से एक तत्व कैसे चुनें किसी तारीख को दिनों की संख्या जोड़ें एंड्रॉइड में क्लिप बोर्ड को टेक्स्ट कॉपी कैसे करें? WPF विंडो शैली को लागू नहीं किया जा रहा है DOCTYPE की कार्यक्षमता क्या है? Android में हैंडलर और मेमोरी लीक ओविन स्व मेजबान और एएसपी नेट एमवीसी बाइंडिंग ऑब्जेक्ट कोड-पीछे में परिभाषित डेटा फ्रेम में "रैंक" कॉलम जोड़ें कैसे सी # में तुलना के लिए एक पूर्णांक के लिए एक महीने के नाम (स्ट्रिंग) को पार्स करने के लिए? चार एस और चार * एस में क्या अंतर है? प्रत्येक समूह में अधिकतम मान के साथ पंक्ति का चयन कैसे करें रेल 3 पर रूबी, असंगत वर्ण एन्कोडिंग: यूटीएफ -8 और आईएसएलआईआईटी-आईआईबीएन के साथ 8 बीआईटी .NET: इसकी स्थिर विधि में "इस" वर्ग का प्रकार निर्धारित करें

एक कनेक्शन जल्दी बंद करें

मैं एक AJAX कॉल (JQuery के माध्यम से) करने की कोशिश कर रहा हूं जो कि काफी लंबी प्रक्रिया शुरू करेगा मैं स्क्रिप्ट को सिर्फ एक प्रतिक्रिया भेजना चाहूंगा कि यह संकेत दिया गया है कि प्रक्रिया शुरू हो गई है, लेकिन जब तक PHP स्क्रिप्ट चल नहीं हो जाती, तब तक JQuery प्रतिक्रिया नहीं लौटाएगा।

मैंने इसे "बंद" शीर्षलेख (नीचे) के साथ, और आउटपुट बफ़रिंग के साथ भी करने की कोशिश की है; न तो काम करने लगता है कोई अंदाज़ा? या यह कुछ है जो मुझे JQuery में करने की ज़रूरत है?

<?php echo( "We'll email you as soon as this is done." ); header( "Connection: Close" ); // do some stuff that will take a while mail( 'dude@thatplace.com', "okay I'm done", 'Yup, all done.' ); ?> 

Solutions Collecting From Web of "एक कनेक्शन जल्दी बंद करें"

निम्न PHP मैन्युअल पृष्ठ (सहित उपयोगकर्ता-नोट्स) PHP स्क्रिप्ट को समाप्त किए बिना ब्राउज़र में TCP कनेक्शन को बंद करने के कई निर्देश सुझाता है:

  • कनेक्शन हैंडलिंग डॉक्स

माना जाता है कि इसे बंद शीर्षलेख भेजने से थोड़ी अधिक आवश्यकता है।


ओपी ने पुष्टि की: हाँ, यह चाल की थी: उपयोगकर्ता नोट # 71172 (नवंबर 2006) की ओर इशारा करते हुए यहां कॉपी किया गया:

अपने PHP स्क्रिप्ट को चलाने के दौरान उपयोगकर्ताओं को ब्राउजर कनेक्शन बंद करना [PHP] के बाद से एक मुद्दा रहा है 4.1, जब register_shutdown_function() का व्यवहार संशोधित किया गया था ताकि यह उपयोगकर्ता कनेक्शन को स्वतः बंद न कर सके।

मेल डॉट xubion dot hu पर एसटीएस मूल समाधान पोस्ट किया गया:

 <?php header("Connection: close"); ob_start(); phpinfo(); $size = ob_get_length(); header("Content-Length: $size"); ob_end_flush(); flush(); sleep(13); error_log("do something in the background"); ?> 

जो ठीक से काम करता है जब तक आप echo('text I want user to see'); लिए phpinfo() विकल्प नहीं देते echo('text I want user to see'); उस स्थिति में हेडर कभी नहीं भेजा जाता है!

इसका समाधान स्पष्ट रूप से उत्पादन बफरिंग को बंद करना और बफर को साफ़ करना है ताकि आपकी हेडर जानकारी भेज सकें। उदाहरण:

 <?php ob_end_clean(); header("Connection: close"); ignore_user_abort(true); // just to be safe ob_start(); echo('Text the user will see'); $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'); ?> 

बस यह एक बाहर आंकड़ा करने की कोशिश में 3 घंटे बिताए, यह किसी को मदद करता है आशा 🙂

में जांच की गई:

  • आईई 7.5730.11
  • मोज़िला फ़ायरफ़ॉक्स 1.81

बाद में जुलाई 2010 में एक संबंधित उत्तर में आर्कटिक फायर ने दो अन्य उपयोगकर्ता नोटों से लिंक किया जो उपरोक्त एक के लिए अनुवर्ती-अप थे:

  • कनेक्शन संभाल उपयोगकर्ता नोट # 89177 (फरवरी 200 9)
  • कनेक्शन संभाल उपयोगकर्ता नोट # 93441 (सितंबर 200 9)

इन 2 हेडर को भेजने के लिए आवश्यक है:

 Connection: close Content-Length: n (n = size of output in bytes ) 

चूंकि आपको अपने आउटपुट के आकार की आवश्यकता है, आपको अपने आउटपुट को बफर करना होगा, फिर इसे ब्राउज़र में फ्लश करना होगा:

 // buffer all upcoming output ob_start(); echo "We'll email you as soon as this is done."; // get the size of the output $size = ob_get_length(); // send headers to tell the browser to close the connection header("Content-Length: $size"); header('Connection: close'); // flush all output ob_end_flush(); ob_flush(); flush(); // if you're using sessions, this prevents subsequent requests // from hanging while the background process executes if (session_id()) session_write_close(); /******** background process starts here ********/ 

इसके अलावा, अगर आपका वेब सर्वर आउटपुट पर स्वचालित जीज़िप संपीड़न का उपयोग कर रहा है (यानी। एपाचे के साथ mod_deflate), यह काम नहीं करेगा क्योंकि आउटपुट का वास्तविक आकार बदल जाता है, और सामग्री-लंबाई अब सटीक नहीं है। Gzip संपीड़न विशेष स्क्रिप्ट को अक्षम करें।

अधिक विवरण के लिए, http://www.zulius.com/how-to/close-browser-connection-continue-execution पर जाएं

पूर्ण संस्करण:

 ignore_user_abort(true);//avoid apache to kill the php running ob_start();//start buffer output echo "show something to user"; session_write_close();//close session file on server side to avoid blocking other requests header("Content-Encoding: none");//send header to avoid the browser side to take content as gzip format header("Content-Length: ".ob_get_length());//send length header header("Connection: close");//or redirect to some url: header('Location: http://www.google.com'); ob_end_flush();flush();//really send content, can't change the order:1.ob buffer to normal buffer, 2.normal buffer to output //continue do something on server side ob_start(); sleep(5);//the user won't wait for the 5 seconds echo 'for diyism';//user can't see this file_put_contents('/tmp/process.log', ob_get_contents()); ob_end_clean(); 

आप fastcgi_end_request() फ़ंक्शन का उपयोग करने के लिए PHP-FPM के साथ फास्ट-सीजीआई का उपयोग कर सकते हैं। इस तरह, आप कुछ प्रसंस्करण करते रह सकते हैं, जबकि प्रतिक्रिया पहले ही ग्राहक को भेजी जा चुकी है।

  • fastcgi_finish_request () (नवंबर 2010) का उपयोग कैसे करें

आप यह PHP मैनुअल में यहां पाते हैं: फास्टसीजीआई प्रोसेस मैनेजर (एफपीएम) ; लेकिन यह कार्य विशेष रूप से पुस्तिका में आगे नहीं लिखा गया है। यहां PHP-FPM से उद्धरण : PHP फास्टसीजीआई प्रक्रिया प्रबंधक विकी :


fastcgi_finish_request ()

क्षेत्र: PHP फ़ंक्शन श्रेणी: ऑप्टिमाइज़ेशन

यह सुविधा आपको कुछ PHP क्वेरीज़ के कार्यान्वयन को गति देने की अनुमति देती है। एक्सीलेरेशन संभव है जब स्क्रिप्ट निष्पादन की प्रक्रिया में कार्रवाई होती है जो सर्वर प्रतिक्रिया को प्रभावित नहीं करती है। उदाहरण के लिए, मेम्कैच में सत्र को सहेजने के बाद पृष्ठ बना दिया जा सकता है और वेब सर्वर पर पास किया जा सकता है। fastcgi_finish_request() एक php सुविधा है, जो प्रतिसाद आउटपुट को रोक देता है। वेब सर्वर तुरंत ग्राहक को "धीरे-धीरे और दुख की बात" के लिए ट्रांसफ़र करना शुरू कर देता है, और एक ही समय में php एक क्वेरी के संदर्भ में कई उपयोगी चीजें कर सकता है, जैसे कि सत्र को सहेजना, डाउनलोड किए गए वीडियो को परिवर्तित करना, सांख्यिकी, आदि

fastcgi_finish_request() शटडाउन समारोह निष्पादित कर सकता है।

मान लें कि आपके पास एक Linux सर्वर और रूट एक्सेस है, यह कोशिश करें यह मैंने पाया सबसे आसान समाधान है

निम्न फ़ाइलों के लिए एक नई निर्देशिका बनाएं और इसे पूर्ण अनुमति दें। (हम इसे बाद में अधिक सुरक्षित बना सकते हैं।)

 mkdir test chmod -R 777 test cd test 

इसे bgping नामक फ़ाइल में रखें

 echo starting bgping ping -c 15 www.google.com > dump.txt & echo ending bgping 

& नोट करें पिंग कमांड पृष्ठभूमि में चलेगा, जबकि वर्तमान प्रक्रिया इको कमांड पर चलेगी यह 15 गुना http://www.google.com को पिंग करेगा, जिसमें लगभग 15 सेकंड लगेंगे।

इसे निष्पादन योग्य बनाओ

 chmod 777 bgping 

इसे bgtest.php नामक फ़ाइल में रखें

 <?php echo "start bgtest.php\n"; exec('./bgping', $output, $result)."\n"; echo "output:".print_r($output,true)."\n"; echo "result:".print_r($result,true)."\n"; echo "end bgtest.php\n"; ?> 

जब आप अपने ब्राउज़र में bgtest.php का अनुरोध करते हैं, तो आपको पिंग कमांड को पूरा करने के लिए लगभग 15 सेकेंड का इंतजार किए बिना, तत्काल प्रतिक्रिया मिलनी चाहिए।

 start bgtest.php output:Array ( [0] => starting bgping [1] => ending bgping ) result:0 end bgtest.php 

पिंग कमांड अब सर्वर पर चलना चाहिए। पिंग कमांड के बजाय, आप PHP स्क्रिप्ट चला सकते हैं:

 php -n -f largejob.php > dump.txt & 

उम्मीद है की यह मदद करेगा!

आप मल्टीथ्रेडिंग करने का प्रयास कर सकते हैं

आप एक स्क्रिप्ट को सचेत कर सकते हैं जो सिस्टम कॉल ( shell_exec का उपयोग कर) बनाता है जो php बाइनरी को स्क्रिप्ट के साथ कॉल करने के लिए कहता है, ताकि आपका काम पैरामीटर के रूप में हो। लेकिन मुझे नहीं लगता कि यह सबसे सुरक्षित तरीका है। हो सकता है कि आप पीएचपी प्रक्रिया और अन्य सामान को कुचलने के द्वारा सामान को गड़बड़ कर सकते हैं

वैकल्पिक रूप से, phpclasses पर एक वर्ग है जो कि http://www.phpclasses.org/browse/package/3953.html लेकिन मैं कार्यान्वयन की विशेषताओं को नहीं जानता

यहां टिम्बो के कोड में संशोधन किया गया है जो gzip संपीड़न के साथ काम करता है।

 // buffer all upcoming output if(!ob_start("ob_gzhandler")){ define('NO_GZ_BUFFER', true); ob_start(); } echo "We'll email you as soon as this is done."; //Flush here before getting content length if ob_gzhandler was used. if(!defined('NO_GZ_BUFFER')){ ob_end_flush(); } // get the size of the output $size = ob_get_length(); // send headers to tell the browser to close the connection header("Content-Length: $size"); header('Connection: close'); // flush all output ob_end_flush(); ob_flush(); flush(); // if you're using sessions, this prevents subsequent requests // from hanging while the background process executes if (session_id()) session_write_close(); /******** background process starts here ********/ 

एक बेहतर समाधान एक पृष्ठभूमि प्रक्रिया कांटा है यह यूनिक्स / लिनक्स पर काफी सीधा है:

 <?php echo "We'll email you as soon as this is done."; system("php somestuff.php dude@thatplace.com >/dev/null &"); ?> 

आपको इस प्रश्न को बेहतर उदाहरण के लिए देखना चाहिए:

PHP एक पृष्ठभूमि प्रक्रिया निष्पादित करता है

जॉयरी सीब्रेच का उत्तर करीब है, लेकिन यह किसी भी मौजूदा सामग्री को नष्ट कर देता है जिसे आप डिस्कनेक्ट करने से पहले बफ़ेड कर सकते हैं। यह ठीक से ignore_user_abort कॉल नहीं करता, स्क्रिप्ट को समय से पहले समाप्त करने की अनुमति देता है diyism का जवाब अच्छा है लेकिन सामान्य रूप से लागू नहीं है। उदाहरण के लिए, किसी व्यक्ति के आउटपुट बफ़र्स में अधिक या कम उत्पादन बफ़र्स हो सकते हैं, जो कि जवाब नहीं संभालता है, इसलिए यह आपकी स्थिति में काम नहीं कर सकता है और आप यह नहीं जान पाएंगे कि क्यों

यह फ़ंक्शन आपको किसी भी समय डिस्कनेक्ट करने की अनुमति देता है (जब तक कि हेडर अभी तक नहीं भेजे गए हैं) और आपके द्वारा अभी तक तैयार की गई सामग्री को बरकरार रखता है। अतिरिक्त प्रसंस्करण समय डिफ़ॉल्ट रूप से असीमित है।

 function disconnect_continue_processing($time_limit = null) { ignore_user_abort(true); session_write_close(); set_time_limit((int) $time_limit);//defaults to no limit while (ob_get_level() > 1) {//only keep the last buffer if nested ob_end_flush(); } $last_buffer = ob_get_level(); $length = $last_buffer ? ob_get_length() : 0; header("Content-Length: $length"); header('Connection: close'); if ($last_buffer) { ob_end_flush(); } flush(); } 

यदि आपको अतिरिक्त मेमोरी की आवश्यकता है, तो भी, इस फ़ंक्शन को कॉल करने से पहले इसे आवंटित करें।

यह मेरे लिए काम किया

 //avoid apache to kill the php running ignore_user_abort(true); //start buffer output ob_start(); echo "show something to user1"; //close session file on server side to avoid blocking other requests session_write_close(); //send length header header("Content-Length: ".ob_get_length()); header("Connection: close"); //really send content, can't change the order: //1.ob buffer to normal buffer, //2.normal buffer to output ob_end_flush(); flush(); //continue do something on server side ob_start(); //replace it with the background task sleep(20); 

ठीक है, तो मूलतः जिस तरह से jQuery के XHR अनुरोध करता है, यहां तक ​​कि ob_flush विधि काम नहीं करेगा क्योंकि आप प्रत्येक onreadystatechange पर फ़ंक्शन चलाने में असमर्थ हैं। jQuery राज्य की जांच करता है, फिर उचित (पूर्ण, त्रुटि, सफलता, समय समाप्त) लेने के लिए चुनता है। और यद्यपि मुझे कोई संदर्भ नहीं मिल पाया था, मुझे ये याद आता है कि यह सभी एक्सएचआर के कार्यान्वयन के साथ काम नहीं करता है। एक विधि जो मुझे विश्वास है कि आप के लिए काम करना चाहिए वह ob_flush और हमेशा-फ़्रेम मतदान के बीच एक क्रॉस है।

 <?php function wrap($str) { return "<script>{$str}</script>"; }; ob_start(); // begin buffering output echo wrap("console.log('test1');"); ob_flush(); // push current buffer flush(); // this flush actually pushed to the browser $t = time(); while($t > (time() - 3)) {} // wait 3 seconds echo wrap("console.log('test2');"); ?> <html> <body> <iframe src="ob.php"></iframe> </body> </html> 

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

एक वैकल्पिक समाधान एक कतार में नौकरी जोड़ने और एक क्रॉन स्क्रिप्ट बनाने के लिए है जो नई नौकरियों की जांच करता है और उन्हें चलाता है।

मुझे एक साझा मेजबान – exec () एट अल द्वारा लगाए गए सीमाओं को दूर करने के लिए हाल ही में ऐसा करना था, जो वेब सर्वर से चलाए गए PHP के लिए अक्षम था, लेकिन एक खोल स्क्रिप्ट में चला सकता था

आपकी समस्या का समाधान पीएचपी में कुछ समानांतर प्रोग्रामिंग करके किया जा सकता है। मैंने इसके बारे में कुछ हफ्ते पहले एक प्रश्न पूछा: PHP अनुप्रयोगों में मल्टी थ्रेडिंग का उपयोग कैसे किया जा सकता है?

और महान जवाब मिला। मुझे विशेष रूप से बहुत पसंद है I लेखक ने पीएचपी (सितंबर 2008; जॉहनिम द्वारा) ट्यूटोरियल में आसान समानांतर प्रसंस्करण के लिए एक संदर्भ बनाया जो वास्तव में आपकी समस्या को बहुत अच्छी तरह से हल कर सकता है क्योंकि मैंने पहले ही ऐसा एक ऐसी समस्या से निपटने के लिए उपयोग किया है जो दो दिन पहले आया था।

Mod_fcgid उपयोगकर्ताओं के लिए ध्यान दें (कृपया, अपने जोखिम पर उपयोग करें)।

त्वरित समाधान

Joeri Sebrechts का स्वीकृत जवाब वास्तव में कार्यात्मक है। हालांकि, यदि आप mod_fcgid का उपयोग करते हैं तो आपको मिल सकता है कि यह समाधान अपने आप पर काम नहीं करता है दूसरे शब्दों में, जब फ्लश फंक्शन को क्लाइंट के कनेक्शन कहा जाता है तो बंद नहीं होता है।

FcgidOutputBufferSize का FcgidOutputBufferSize कॉन्फ़िगरेशन पैरामीटर दोष हो सकता है। मुझे इस टिप में पाया गया है:

  1. ट्रैवर्स कार्टर का यह जवाब और
  2. सीयूमास मैकिनन के इस ब्लॉग पोस्ट

उपरोक्त पढ़ने के बाद, आप इस निष्कर्ष पर आ सकते हैं कि एक त्वरित समाधान लाइन जोड़ना होगा (अंत में "उदाहरण वर्चुअल होस्ट" देखें):

 FcgidOutputBufferSize 0 

या तो आपकी अपाचे कॉन्फ़िगरेशन फ़ाइल (जैसे, httpd.conf), आपकी FCGI विन्यास फाइल (जैसे, fcgid.conf) या आपकी वर्चुअल होस्ट फ़ाइल (जैसे, httpd-vhosts.conf) में।

उपरोक्त (1) में, "आउटपुट बफर साइज़" नामित एक चर का उल्लेख किया गया है। यह (2) में उल्लेखित FcgidOutputBufferSize का पुराना नाम है ( FcgidOutputBufferSize लिए अपाचे वेब पेज में अपग्रेड नोट्स देखें)।

विवरण और एक दूसरा समाधान

उपरोक्त समाधान mod_fcgid द्वारा पूरा सर्वर या विशिष्ट वर्चुअल मेजबान के लिए बफरिंग को अक्षम करता है। इससे आपकी वेब साइट के लिए प्रदर्शन जुर्माना हो सकता है दूसरी तरफ, यह ठीक नहीं हो सकता है क्योंकि पीएचपी बफरिंग को अपने आप करता है।

यदि आप 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" है, जैसा कि संबंधित निर्देश के लिए अपाचे वेब पृष्ठ में उल्लिखित है। इसलिए, आपको इस मूल्य को तदनुसार समायोजित करने की आवश्यकता हो सकती है अगर आपके मानदंड में एक और मान सेट हो।

मेरा पर्यावरण

  • WampServer 2.5
  • अपाचे 2.4.9
  • PHP 5.5.19 वीसी 11, एक्स 86, गैर धागा सुरक्षित
  • mod_fcgid / 2.3.9
  • विंडोज 7 प्रोफेशनल एक्स 64

उदाहरण वर्चुअल होस्ट

 <VirtualHost *:80> DocumentRoot "d:/wamp/www/example" ServerName example.local FcgidOutputBufferSize 0 <Directory "d:/wamp/www/example"> Require all granted </Directory> </VirtualHost> 

मैं एक साझा मेजबान पर हूं और fastcgi_finish_request पूरी तरह से स्क्रिप्ट से बाहर निकलने के लिए सेटअप है मुझे connection: close पसंद नहीं है connection: close समाधान या तो। इसका उपयोग करना, अतिरिक्त सर्वर संसाधनों की लागत के बाद के अनुरोधों के लिए एक अलग कनेक्शन को बल देता है। मैं Transfer-Encoding: cunked विकिपीडिया लेख Transfer-Encoding: cunked और सीखा है कि 0\r\n\r\n एक प्रतिक्रिया समाप्त कर देती है मैंने इसे पूरी तरह से ब्राउज़रों के संस्करणों और डिवाइसों पर परीक्षण नहीं किया है, लेकिन यह मेरे सभी 4 मौजूदा ब्राउज़रों पर काम करता है।

 // Disable automatic compression // @ini_set('zlib.output_compression', 'Off'); // @ini_set('output_buffering', 'Off'); // @ini_set('output_handler', ''); // @apache_setenv('no-gzip', 1); // Chunked Transfer-Encoding & Gzip Content-Encoding function ob_chunked_gzhandler($buffer, $phase) { if (!headers_sent()) header('Transfer-Encoding: chunked'); $buffer = ob_gzhandler($buffer, $phase); return dechex(strlen($buffer))."\r\n$buffer\r\n"; } ob_start('ob_chunked_gzhandler'); // First Chunk echo "Hello World"; ob_flush(); // Second Chunk echo ", Grand World"; ob_flush(); ob_end_clean(); // Terminating Chunk echo "\x30\r\n\r\n"; ob_flush(); flush(); // Post Processing should not be displayed for($i=0; $i<10; $i++) { print("Post-Processing"); sleep(1); } 

यदि flush() फ़ंक्शन काम नहीं करता है आपको अगले विकल्पों को php.ini में सेट करना होगा जैसे:

 output_buffering = Off zlib.output_compression = Off 

टीएल; डीआर उत्तर:

 ignore_user_abort(true); //Safety measure so that the user doesn't stop the script too early. $content = 'Hello World!'; //The content that will be sent to the browser. header('Content-Length: ' . strlen($content)); //The browser will close the connection when the size of the content reaches "Content-Length", in this case, immediately. ob_start(); //Content past this point... echo $content; //...will be sent to the browser (the output buffer gets flushed) when this code executes. ob_end_flush(); ob_flush(); flush(); if(session_id()) { session_write_close(); //Closes writing to the output buffer. } //Anything past this point will be ran without involving the browser. 

फ़ंक्शन उत्तर:

 ignore_user_abort(true); function sendAndAbort($content) { header('Content-Length: ' . strlen($content)); ob_start(); echo $content; ob_end_flush(); ob_flush(); flush(); } sendAndAbort('Hello World!'); //Anything past this point will be ran without involving the browser. 

नवीनतम कार्य समाधान

  // client can see outputs if any ignore_user_abort(true); ob_start(); echo "success"; $buffer_size = ob_get_length(); session_write_close(); header("Content-Encoding: none"); header("Content-Length: $buffer_size"); header("Connection: close"); ob_end_flush(); ob_flush(); flush(); sleep(2); ob_start(); // client cannot see the result of code below