2011-02-28 9 views
10

PHP दस्तावेज़ इस पर थोड़ा अस्पष्ट हैं, इसलिए मैं इसे यहां पूछ रहा हूं। इस कार्यकर्ता कोड को देखते हुए:गियरमैन और PHP: एक विफलता वापस भेजने के लिए एक कर्मचारी के लिए उचित तरीका

<?php 
$gmworker= new GearmanWorker(); 
$gmworker->addServer(); 
$gmworker->addFunction("doSomething", "doSomethingFunc"); 
while($gmworker->work()); 

function doSomethingFunc() 
{ 
    try { 
     $value = doSomethingElse($job->workload()); 
    } catch (Exception $e) { 
     // Need to notify the client of the error 
    } 

    return $value; 
} 

किसी भी त्रुटि के क्लाइंट को सूचित करने का उचित तरीका क्या है? विवरण झूठा है? GearmanJob :: sendFail() का उपयोग करें? यदि यह उत्तरार्द्ध है, तो क्या मुझे sendFail() को कॉल करने के बाद अपने doSomethingFunc() से वापस लौटना होगा? क्या रिटर्न वैल्यू जो कुछ भी भेजता है वह विफल होगा() रिटर्न?

ग्राहक विफलताओं की जांच के लिए गियरमैन क्लाइंट :: रिटर्नकोड() का उपयोग कर रहा है। इसके अतिरिक्त, "रिटर्न $ वैल्यू" का उपयोग करके काम करना प्रतीत होता है, लेकिन क्या मुझे इसके बजाय गियरमैन जॉब :: sendData() या GearmanJob :: sendComplete() का उपयोग करना चाहिए?

+0

यह ध्यान दिया जाना चाहिए कि आप केवल सामान्य कार्यों ('GearmanClient :: do() ') के साथ इस जानकारी को पुनर्प्राप्त कर सकते हैं, पृष्ठभूमि कार्यों' GearmanClient :: doBackground()') नहीं। यह भी देखें: http://stackoverflow.com/a/11631673/664108 –

उत्तर

8

यह ऐसा करने का सबसे अच्छा तरीका नहीं हो सकता है, लेकिन यह तरीका है जिसे मैंने अतीत में उपयोग किया है और यह मेरे लिए अच्छा काम करता है।

मैं sendException() का उपयोग करता हूं जिसके बाद कार्यकर्ता में जॉब विफलता वापस करने के लिए भेजें। अपवाद भाग वैकल्पिक है लेकिन मैं इसका उपयोग करता हूं ताकि क्लाइंट त्रुटि दे सके और पता चले कि यह क्यों विफल हुआ। भेजने के बाद मैं कुछ और नहीं लौटाता हूं। अन्यथा आप इस तरह के jobserver काम सोच के रूप में अजीब परिणाम मिल सकते हैं()

public function doJob(GearmanJob $job) 
{ 
    $this->_gearmanJob = $job; 


    try{ 
     //This method does the actual work 
     $this->_doJob($job->functionName()); 
    } 
    catch (Exception $e) { 
     $job->sendException($e->getMessage()); 
     $job->sendFail(); 
    } 
} 

sendFail के बाद कुछ और नहीं लौटते,: एक उदाहरण के रूप में इस के लिए एक विधि है कि कार्यकर्ता काम करने के लिए कॉलबैक के रूप में पंजीकृत करता है ठीक हो गया

लौटने वाले डेटा के संबंध में, मैं sendData() का उपयोग करता हूं यदि मैं खंडों में डेटा लौटा रहा हूं (जैसे ट्रांसकोड किए गए वीडियो स्ट्रीमिंग, या किसी भी 'बड़े' डेटा जहां मैं एक बड़े ब्लब्स के चारों ओर स्थानांतरित नहीं करना चाहता) विभिन्न अंतराल पर अंत में एक sendComplete() के साथ मेरे काम के दौरान। अन्यथा यदि मैं केवल नौकरी के अंत में एक ही समय में अपना डेटा वापस करना चाहता हूं तो मैं केवल sendComplete() का उपयोग करता हूं।

उम्मीद है कि इससे मदद मिलती है।

+0

वीडियो स्ट्रीम करने के लिए गियरमैन का उपयोग करना शानदार लगता है। अपने सॉफ़्टवेयर के आर्किटेक्चर के बारे में और जानना अच्छा लगेगा ... –

+1

@ ओमेगा यह वीडियो देखने की सामान्य समझ में वीडियो स्ट्रीमिंग नहीं कर रहा था, लेकिन कहीं और स्टोरेज के लिए ट्रांसकोडिंग को तोड़ दिया। इसके अलावा - यह निश्चित रूप से नहीं है कि मैं इन दिनों कैसे करूँगा :-) –

+0

@ जेम्ससटलर आप इन दिनों यह कैसे करेंगे? – dre