2012-01-18 12 views
18

से पहले पृष्ठ बदलता है तो मैं कुछ डेटाबेस रखरखाव करने के लिए AJAX पर एक php स्क्रिप्ट कॉल कर रहा हूं। यदि उपयोगकर्ता पृष्ठ को बंद करता है, वापस हिट करता है, या किसी लिंक पर क्लिक करता है, तो क्या PHP स्क्रिप्ट पूरी तरह से निष्पादित की जाएगी? क्या इसे करने का कोई तरीका है?क्या होता है यदि कोई उपयोगकर्ता ब्राउज़र से बाहर निकलता है या AJAX अनुरोध

हो सकता है कि अगर PHP स्क्रिप्ट exec() विधि या कुछ इसी तरह कहा जाता है, जो बारी में होंगे, जैसे कंसोल के माध्यम से एक स्क्रिप्ट फोन:

$ php /var/www/httpdocs/maintenance.php 

?

उत्तर

13

जब तक उपयोगकर्ता एजेंट (ब्राउज़र, आदि) ने पूरी तरह से अनुरोध भेज दिया है, सर्वर के पास इसकी सभी ज़रूरत है और अनुरोध पूरा कर देगा और प्रतिक्रिया वापस भेजने का प्रयास करेगा।

वास्तव में, इस तरह के "पिंगिंग" व्यवहार का प्रयोग अक्सर "दिल की धड़कन" जैसी प्रक्रियाओं के लिए किया जाता है जो एक सेवा को गर्म रखता है या आवधिक रखरखाव करता है।

2

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

+0

इससे बचने का कोई तरीका है? –

+0

@ सुशांत बाजराचार्य आप एक चर का उपयोग कर सकते हैं जो कॉल किए जाने पर "1" पर सेट होता है, और यदि उपयोगकर्ता "1" के दौरान रीडायरेक्ट करने का प्रयास करता है तो उन्हें एक संदेश मिलता है जो वे नहीं कर सकते हैं। जब कॉल किया जाता है, तो यह फिर "0" पर जाता है और पुनर्निर्देशन की अनुमति देता है। –

14

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

यदि आप यह सुनिश्चित करना चाहते हैं कि स्क्रिप्ट बंद होने से पहले सभी ऑपरेशन पूर्ण हो जाएं, तो ignore_user_abort(TRUE) का उपयोग करें, जो कनेक्शन को तोड़ने के बाद PHP चल रहा है। यह अभी भी उपयोगकर्ता max_execution_time सीमाओं और क्या नहीं है, लेकिन यह बंद नहीं होगा क्योंकि आप डिस्कनेक्ट हैं।

+0

तो अगर Apache का पता चलता है कि रिमोट कनेक्शन बंद हो गया है तो निष्पादन समाप्त हो जाने से पहले एक PHP स्क्रिप्ट रोक सकती है? –

+1

हाहाहा, मैंने पाया कि पोस्टिंग के बाद सही कार्य, मेरे प्रश्न को रद्द करने और इसे स्वयं जवाब देने का प्रयास किया, लेकिन मेरे पास अभी तक पर्याप्त उच्च प्रतिष्ठा नहीं है।यहां मैं जो लिखना चाहता था, वह सब गलत चीज़ खोजने के साथ समय खोने के लिए खेद है: ** ठीक है, अभी भी पता नहीं है कि AJAX के साथ वास्तव में क्या होता है, लेकिन मुझे PHP स्क्रिप्ट को समाप्त होने से रोकने के लिए एक तरीका मिला समारोह के साथ PHP स्क्रिप्ट व्यवधान: ignore_user_abort() http://php.net/manual/en/function.ignore-user-abort.php मैं बजाय शुरुआत से पीएचपी पर मेरे अनुसंधान करना चाहिए था AJAX, मैंने इसे तुरंत पाया। ** – NaturalBornCamper

+0

हो सकता है, लेकिन ऐसा नहीं है। खेल में अन्य कारक हैं, लेकिन सैद्धांतिक रूप से हां, एक उपयोगकर्ता स्टोर (एस) को स्टोर की सूची के बाद ईएससी पर मारकर ईकॉमर्स चेकआउट प्रक्रिया पूरी तरह से खो सकता है लेकिन भुगतान संसाधित होने से पहले। –

0

एक बार AJAX कॉल को लात मारने के बाद, उपयोगकर्ता जो चाहें वह करने के लिए स्वतंत्र है। अगर वे पृष्ठ बंद करते हैं तो उन्हें केवल अजाक्स कॉल से फीडबैक (यदि कोई हो) नहीं मिलेगा।

0

यदि php निष्पादन शुरू होता है तो यह उपयोगकर्ता को विंडो बंद कर देता है या पृष्ठ से दूर नेविगेट करता है, तो यह निष्पादित करना जारी रखेगा।

0

ब्राउज़र स्थिति के बावजूद PHP स्क्रिप्ट पूर्ण हो जाएगी। Php को सर्वर पर पार्स किया गया है, और इस पर कोई परवाह नहीं है कि क्लाइंट अभी भी खुला है या नहीं।

0

यदि HTTP अनुरोध पूरा हो गया था, तो हाँ, PHP स्क्रिप्ट पूरी तरह निष्पादित की जाएगी भले ही क्लाइंट का कंप्यूटर बंद हो।

1

सेटिंग्स, वेब सर्वर, ऑपरेटिंग सिस्टम आदि पर भिन्न होता है।

आमतौर पर अनुरोध सामान्य रूप से संसाधित किया जाएगा, और प्रतिक्रिया को कभी भी पढ़ा नहीं जाएगा। कभी-कभी, एक लेखन पहले विफल हो सकता है, और प्रसंस्करण के दौरान अनुरोध विफल रहता है।

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