2012-06-08 14 views
6

मैं ज़ीरोएमक्यू का सफलतापूर्वक PHP के साथ उपयोग कर रहा हूं और एक नौकरी सर्वर लिखा है। मेरे पास एक व्यवस्थापक स्क्रिप्ट है जो सर्वर के स्वास्थ्य पर जांच करती है और इसे टाइमआउट के साथ पिंग करने जैसी चीजें करता है।टाइमआउट के बाद ज़ीरोएमक्यू सॉकेट को डिस्कनेक्ट कैसे करें?

सर्वर ऊपर होने पर सबकुछ बढ़िया काम करता है, लेकिन जब यह नीचे होता है (और ZMQPoll अपेक्षित रूप से बाहर निकलता है) मेरी स्क्रिप्ट वह करता है जो इसे माना जाता है - लेकिन स्क्रिप्ट कभी समाप्त नहीं होती है।

मैंने सभी सॉकेट चर, आदि को साफ करने और अनसेट करने का प्रयास किया है .. लेकिन exit() को भी PHP स्क्रिप्ट लटकती है।

कोई सॉकेट disconnect() विधि प्रतीत नहीं होता है, तो मैं PHP कैसे बता सकता हूं कि सॉकेट मर चुका है और मैं इसे लटका नहीं चाहता हूं?

यह मेरा व्यवस्थापक स्क्रिप्ट से नीचे कोड का एक टुकड़ा है -

 // ... 
     // waiting for dead server on zmqsock to respond after sending a message 
     // 
     $poll = new ZMQPoll; 
     $poll->add($this->zmqsock, ZMQ::POLL_IN); 
     $readable = $writeable = array(); 
     $poll->poll($readable, $writeable, $timeout * 1000); 
     if($errors = $poll->getLastErrors()) { 
      foreach ($errors as $err) { 
       throw new Exception($err); 
      } 
     } 
     if(! $readable){ 
      // clean up everything, raise errors, etc.. 
      $poll->clear(); 
      unset($poll, $this->zmqsock, $this->zmqcontext); 
      // Script hangs here 
      exit(0); 
     } 
     // .. 
+0

पर ZMQ_LINGER बिट पर एक नज़र डालें! धन्यवाद! – Franquis

उत्तर

7

ZeroMQ कोशिश करते हैं और संदेश लंबित जब यह बंद हो जाता है वितरित कर देगा - आप (ZMQ :: SOCKOPT_LINGER सॉकेट विकल्प की स्थापना द्वारा नियंत्रित कर सकते हैं कि जो आपको से पहले कनेक्ट करना होगा), जो आपको जल्दी समाप्त करने की अनुमति देनी चाहिए।

मेरा दिन सहेजा http://api.zeromq.org/2-1:zmq-setsockopt

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