2009-11-12 13 views
7

मैं pcntl_fork उपयोग कर रहा हूँ एक बच्चे की प्रक्रिया शुरू करने SMTP के माध्यम से एक ईमेल भेजने के द्वारा शुरू कर दिया।पीएचपी - हत्या बच्चे प्रक्रिया pcntl_fork

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

इस के आसपास पाने के लिए मैं 30 सेकंड है कि बच्चे की प्रक्रिया को मारता है अगर यह अभी भी चल रहा है के बाद एक समारोह को गति प्रदान करने pcntl_alarm समारोह का उपयोग कर रहा हूँ।

function handlesig($sig) { 
    global $pid,$node,$resend; 
    posix_kill($pid,SIGKILL); 
    mysql_query("insert into log (event) values ('Timed out!')"); 
} 

जब मैं बाल प्रक्रिया को मारता हूं हालांकि मुझे सिस्टम पर एक निष्क्रिय प्रक्रिया के साथ छोड़ दिया जाता है।

वहाँ एक अलग संकेत मुझे लगता है कि का उपयोग करना चाहिए अभी भी बच्चे को प्रक्रिया के लिए बाध्य करेगा कनेक्शन के लिए प्रतीक्षारत (क्योंकि कनेक्शन खत्म कभी नहीं होगा) के बिना मर जाते हैं और मृत प्रक्रियाओं का निर्माण हो से बचने के लिए है?

उत्तर

5

आप की जरूरत है या तो जैसा कि ऊपर वर्णित यह लिए प्रतीक्षा करें, या बच्चे प्रक्रिया माता पिता से अलग करने posix_setsid

1

इस समस्या का सामान्य समाधान एक अच्छा कॉन्फ़िगर किया गया स्थानीय होस्ट रिले का उपयोग कर रहा है। मैं क्या मानक करता हूं पोस्टफिक्स का उपयोग कर स्थानीय होस्ट रिलीज स्थापित कर रहा हूं।

फिर im वाला स्थानीय रिले है, जो यह कतारों और जल्द से जल्द प्राप्तकर्ता को भेजने के लिए ई-मेल भेजते हैं।

यह स्थानीय रिले के लिए भेजने के बारे में अच्छी बात आप उछाल ई-मेल, और अन्य answeres के लिए कॉन्फ़िगर कर सकते हैं।

आप के लिए निष्क्रिय के बारे में सवाल है, जहां तक ​​मुझे पता है कि सिग्कील प्रक्रिया को बंद करने के लिए एक बहुत ही कठिन विधि है, क्या आपने कोशिश की (सिगस्टॉप या सिगस्ट)?

+0

कारण मैं सख्त भेज रहा हूँ का उपयोग कर PHP के माध्यम से ctly है इसलिए मैं प्रतिक्रिया प्राप्त कर सकता हूं और सफलता/मुलायम उछाल/हार्ड बाउंस के लिए इसे उचित रूप से संभाल सकता हूं। सिगरम और सिगकिल एकमात्र सिग्नल हैं जिन्हें मैं जानता हूं, और सिगरेट काम नहीं करता था इसलिए मैंने सिगकिल का इस्तेमाल किया। मैं सिगस्टॉप/सिग्स्टस्ट की कोशिश करूंगा। – Tim

+0

हम्म मैं व्यक्तिगत रूप से 2 अलग-अलग स्क्रिप्ट में ऐसा करूंगा।एक स्थानीय smtp सेवा के माध्यम से भेजने के लिए बाउंस को संभालने के लिए सिक्योर, एक प्रकार का स्वचालित पॉप/स्क्रिप्ट प्राप्त करें, जो बाउंस और सफलता के लिए संभालती है। इसका एक कारण यह है कि php स्क्रिप्ट जो smtp को मेल प्रदान करती है वह वेब-सर्वर बच्चों को अवरुद्ध नहीं कर रही है। उदाहरण के लिए यदि आपके पास अधिकतम 20 बच्चे हैं और प्रत्येक बच्चा किसी बाहरी स्रोत से कनेक्शन शुरू कर रहा है, तब तक कोई अन्य सेवा तब तक उपलब्ध नहीं है जब तक कोई बच्चा फिर से मुक्त न हो जाए। – user207675

1
exec(PATH_TO_PHP . " email_script.php $params > /dev/null 2>&1 &"); 

इस तरह माता-पिता बच्चे से प्रतिक्रिया की प्रतीक्षा नहीं कर रहे हैं और आपके पास ज़ोंबी नहीं है। Email_script.php में अपना ईमेल भेजना और फ़ाइल को प्रतिक्रिया लॉग करना, जिसे आप अपनी मूल लिपि से विश्लेषण कर सकते हैं या नहीं।

4

आप ज़ोंबी बच्चे हैं, तो यह आप उनके लिए ing नहीं wait रहे हैं मतलब है। एक PHP विशेषज्ञ नहीं है, लेकिन सिस्टम कॉल waitpid(2) है। जैसे

waitpid(-1, NULL, WNOHANG); 

हर अब और फिर कहते हैं, या जब भी आप SIGCHILD मिलता है। प्रत्येक कॉल एक ज़ोंबी तक काट जाएगा। यदि कोई बहिष्कृत बच्चे नहीं हैं तो ब्लॉक करने के बजाय WNOHANG इसे तुरंत वापस कर देता है।

wait आदमी पेज कैसे यह सब काम करता है पर एक अच्छा नोट अनुभाग है ...

1

पीटर anwser को पूरा करने के pcntl_waitpid

पर एक नज़र डालें बस मारने के बाद ऐसा करने की जरूरत है: pcntl_waitpid($pid)

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