2010-03-07 9 views
5

मेरे पास एक वेबसाइट है जो सर्वर के पक्ष में PHP के साथ काम करती है।PHP: ignore_user_abort (true) सभी स्क्रिप्ट में

उपयोगकर्ता पृष्ठों पर पहुंचने और PHP कुछ गणना करता है, एक MySQL डेटाबेस आदि

एक उपयोगकर्ता की कल्पना में डेटा लिखता है एक पृष्ठ जहाँ पीएचपी उपयोगकर्ता के लिए एक खाता बनाता एक्सेस करता है। सृजन में दो भाग होते हैं: तालिका "उपयोगकर्ताओं" में पंजीकरण डेटा डालना और इस खाते के लिए "सेटिंग्स" तालिका में सेटिंग्स डालना। ये दो SQL क्वेरी हैं जिन्हें एक के बाद एक निष्पादित किया जाना है। यदि उपयोगकर्ता पहली क्वेरी के बाद पृष्ठ छोड़ देता है, तो "सेटिंग्स" में कोई भी मान डाला नहीं गया है।

मैं इस मुद्दे से कैसे बच सकता हूं? मुझे बस ignore_user_abort (सच) का उपयोग करके लगता है, है ना?

तो क्या प्रत्येक PHP स्क्रिप्ट के शीर्ष पर ignore_user_abort (true) को कॉल करना उपयोगी नहीं है? मुझे किसी भी मामले में नहीं पता है जहां इसे समस्याएं पैदा करनी चाहिए।

उत्तर

8

आपके विशिष्ट उदाहरण के लिए, डेटाबेस लेनदेन (जैसा कि इग्नासिओ द्वारा उल्लिखित) का उपयोग करना अधिक उपयुक्त दृष्टिकोण होगा।

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

हालांकि, ध्यान दें कि कनेक्शन को निरस्त करने वाले क्लाइंट के कारण टूटा हुआ पाइप निष्पादन तुरंत को रोक नहीं देता है, केवल उस बिंदु पर जब आप स्क्रिप्ट आउटपुट को लिखने का प्रयास करते हैं। यह echo या print पर कॉल करके या यहां तक ​​कि केवल एक PHP टैग बंद करके और एक नया (... ?> <?php ...) खोलने से पहले कुछ सफेद जगह डालने के माध्यम से हो सकता है। इसलिए यदि पृष्ठ के शीर्ष पर आपके स्क्रिप्ट का सभी 'एक्शन' हिस्सा है, तो आप किसी पेज की सामग्री लिखने से पहले, आपको अपने ऐप लॉजिक को प्रभावित करने वाली टूटी हुई पाइप से बाधाओं के बारे में चिंता करने की ज़रूरत नहीं है।

और निश्चित रूप से आपको वैसे भी पृष्ठ सामग्री से कार्रवाई तर्क को अलग करना चाहिए।

2

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

अगर रिमोट पक्ष के अनुरोध को रद्द करने के लिए यह आसान हो सकता है तो उदा। अनुरोध में लंबी गणना शामिल है और उपयोगकर्ता निर्णय लेता है कि उन्हें परिणामों के बाद परिणामों की आवश्यकता नहीं है।

1

आप php.ini में ignore_user_abort सेट कर सकते हैं: PHP.ini configuration

मैं इस हालांकि ऐसा नहीं करेंगे। मुझे लगता है कि PHP पृष्ठ कमांड लाइन पर एक और PHP उदाहरण शुरू करेगा जो पृष्ठभूमि में पूछताछ करता है, उदा। exec का उपयोग कर।

इसके अलावा, यह हो सकता है कि आपकी मूल प्रवाह अवधारणा खराब हो। यदि उपयोगकर्ता गणना के निष्पादन को रोकता है, तो आपको शायद इसे ठीक तरह से वापस रोल करना चाहिए - लेकिन यह जो किया जा रहा है उसकी प्रकृति पर निर्भर करता है।

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