समस्या
मेरे पास एक फॉर्म है, जिसे सबमिट करते समय, सबमिट की गई जानकारी को संसाधित करने के लिए एक बुनियादी कोड चला जाएगा और इसे एक अधिसूचना वेबसाइट पर प्रदर्शित करने के लिए डेटाबेस में डाला जाएगा। इसके अलावा, मेरे पास उन लोगों की एक सूची है, जिन्होंने ईमेल और एसएमएस संदेश के माध्यम से इन सूचनाओं को प्राप्त करने के लिए साइन अप किया है। यह सूची क्षण के रूप में तुच्छ है (केवल 150 के बारे में जोर दे रही है), हालांकि यह पर्याप्त है क्योंकि यह ग्राहकों की पूरी तालिका के माध्यम से चक्र में एक मिनट से ऊपर ले जाता है और 150+ ईमेल भेजता है। (ईमेल को बड़े पैमाने पर ईमेल नीतियों के कारण हमारे ईमेल सर्वर के सिस्टम प्रशासकों द्वारा अनुरोध के अनुसार व्यक्तिगत रूप से भेजा जा रहा है।)
इस समय के दौरान, अलर्ट पोस्ट करने वाला व्यक्ति बिना किसी सकारात्मक सुदृढीकरण के लगभग एक मिनट के लिए फॉर्म के अंतिम पृष्ठ पर बैठ जाएगा कि उसकी अधिसूचना पोस्ट की जा रही है। यह अन्य संभावित समस्याओं की ओर ले जाता है, सभी संभव समाधान हैं जो मुझे लगता है कि आदर्श से कम हैं।
सबसे पहले, पोस्टर को लग सकता है कि सर्वर पिछड़ रहा है और फिर से 'सबमिट' बटन पर क्लिक करें, जिससे स्क्रिप्ट दो बार शुरू या चालू हो जाएगी। मैं बटन को अक्षम करने के लिए जावास्क्रिप्ट का उपयोग करके इसे हल कर सकता हूं और पाठ को 'प्रोसेसिंग ...' जैसी किसी चीज को कहने के लिए बदल सकता हूं, हालांकि यह आदर्श से कम है क्योंकि उपयोगकर्ता अभी भी स्क्रिप्ट निष्पादन की लंबाई के लिए पेज पर अटक जाएगा। (इसके अलावा, यदि जावास्क्रिप्ट अक्षम है, यह समस्या अभी भी मौजूद है।)
दूसरा, फॉर्म जमा करने के बाद पोस्टर समय से पहले टैब या ब्राउज़र को बंद कर सकता है। स्क्रिप्ट तब तक सर्वर पर चलती रहेगी, जब तक वह ब्राउज़र पर वापस लिखने की कोशिश नहीं करता है, हालांकि अगर उपयोगकर्ता तब हमारे डोमेन के भीतर किसी भी पेज पर पहुंचता है (जबकि स्क्रिप्ट अभी भी चल रही है), तो ब्राउज़र पेज को लोड होने तक लटका देता है जब तक कि स्क्रिप्ट समाप्त नहीं हो जाती। । (यह केवल तब होता है जब ब्राउज़र की एक टैब या विंडो बंद हो जाती है और संपूर्ण ब्राउज़र अनुप्रयोग नहीं।) फिर भी, यह आदर्श से कम है।
(संभव) समाधान
मैंने तय किया है कि मैं स्क्रिप्ट के "ईमेल" भाग को एक अलग फ़ाइल में तोड़ना चाहता हूं जिसे अधिसूचना पोस्ट होने के बाद मैं कॉल कर सकता हूं। मैंने मूल रूप से अधिसूचना के सफलतापूर्वक पोस्ट होने के बाद पुष्टि पृष्ठ पर इसे डालने के बारे में सोचा था। हालाँकि, उपयोगकर्ता को यह नहीं पता होगा कि यह स्क्रिप्ट चल रही है और कोई भी विसंगति उनके लिए स्पष्ट नहीं होगी; यह स्क्रिप्ट विफल नहीं हो सकती।
लेकिन, क्या होगा अगर मैं इस स्क्रिप्ट को पृष्ठभूमि प्रक्रिया के रूप में चला सकता हूं? तो, मेरा सवाल यह है: मैं एक पृष्ठभूमि सेवा के रूप में ट्रिगर करने के लिए एक PHP स्क्रिप्ट को कैसे निष्पादित कर सकता हूं और उपयोगकर्ता को फॉर्म स्तर पर क्या किया है, इसके बारे में पूरी तरह से स्वतंत्र है?
संपादित करें: यह क्रोन'एड नहीं हो सकता। यह प्रपत्र प्रस्तुत किया गया है तत्काल चलना चाहिए। ये उच्च प्राथमिकता वाले नोटिफिकेशन हैं। इसके अलावा, हमारे सर्वर चलाने वाले सिस्टम एडमिनिस्ट्रेटर क्रोन को 5 मिनट से अधिक बार चलाने से रोकते हैं।
exec()
लेकिन मैंने कभी यह कोशिश नहीं की।
ajax
और डालने sleep()
पाश अंदर समय अंतराल के साथ (मैं अपने मामले में foreach का उपयोग करें) पृष्ठभूमि प्रक्रिया को चलाने के लिए। यह मेरे सर्वर में पूरी तरह से काम करता है। दूसरों के बारे में निश्चित नहीं। मैं भी जोड़ा जा रहा ignore_user_abort()
है और set_time_limit()
पाश सुनिश्चित करें कि स्क्रिप्ट सर्वर मैं उपयोग के द्वारा बंद कर दिया नहीं किया जाएगा बनाने के लिए करने से पहले (गणना की समाप्ति समय के साथ), यहां तक कि अपने परीक्षण के अनुसार, स्क्रिप्ट के बिना कार्य पूरा ignore_user_abort()
और set_time_limit()
।
gearman
बैकग्राउंड टास्क से निपटने के लिए php का इस्तेमाल करता हूं । यदि आप बड़े समय प्रसंस्करण और भारी भार के साथ आए तो यह पैमाने के लिए एकदम सही है। आपको इस पर ध्यान देना चाहिए।