PHP

2015-07-17 3 views
5

में एक ही समय में SOAP और REST वेब सेवा का उपभोग करना मेरा उद्देश्य विभिन्न वेब सेवाओं का उपभोग करता है और फिर परिणामों को मर्ज करता है।PHP

मैं PHP cURL का उपयोग कर ऐसा कर रहा था, लेकिन वेब सेवाओं की संख्या में वृद्धि हुई है, इसलिए मेरी सेवा धीमी हो गई है क्योंकि प्रक्रिया प्रतिक्रिया के लिए प्रतीक्षा कर रही थी और फिर अगली वेब सेवा के लिए अनुरोध कर रही थी।

मैंने curl_multi का उपयोग करके इस समस्या को हल किया और सब कुछ ठीक काम कर रहा था।

अब, मुझे एक नई समस्या है, क्योंकि मेरी सेवा में जोड़ने के लिए नई वेब सेवाएं हैं जो Soap Protocol का उपयोग करती हैं और मैं अब एक साथ अनुरोध नहीं कर सकता, क्योंकि मैं सोप वेब सेवाओं के लिए curl का उपयोग नहीं करता, मैं उपयोग करता हूं SoapClient

मुझे पता है कि मैं एक्सएमएल को साबुन निर्देशों के साथ बना सकता हूं और फिर इसे curl के साथ भेज सकता हूं, लेकिन यह मुझे एक बुरा अभ्यास प्रतीत होता है।

संक्षेप में, क्या आरईएसटी और एसओएपी वेब सेवाओं को एक साथ उपभोग करने का कोई तरीका है?

उत्तर

5

का उपयोग मैं पहली बार एक एकीकृत, अतुल्यकालिक guzzle सेटअप की कोशिश करेंगे के रूप में अन्य लोगों ने कहा सकता है। यदि यह काम नहीं करता है तो मैं प्रक्रिया फोर्किंग या मल्टीथ्रेडिंग का उपयोग कर का सुझाव नहीं देता हूं। न तो उपयोग या रखरखाव के लिए आसान हैं। उदाहरण के लिए, mixing guzzle and threads पर विशेष ध्यान देने की आवश्यकता है।

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

जब मैं इस आर्किटेक्चर का उपयोग करता हूं तो मैं एक कुंजी-मूल्य स्टोर या डेटाबेस में "सेमफोर" का ट्रैक भी रखता हूं। एपीआई कॉल की गिनती के साथ सेमफोर शुरू करें। चूंकि प्रत्येक पूरा हो जाता है तो गिनती कम हो जाती है। प्रत्येक प्रक्रिया जांचती है जब गिनती शून्य हो जाती है और फिर आप जानते हैं कि सभी काम किए जाते हैं। यह केवल तब आवश्यक है जब कोई कार्यवाही हो, जैसे सभी एपीआई परिणामों से कुछ की गणना करना या उपयोगकर्ताओं को नौकरी पता करने के लिए एक रिकॉर्ड अपडेट करना।

अब यह सेटअप प्रक्रिया फोर्किंग या मल्टीथ्रेडिंग की तुलना में अधिक जटिल लगता है, लेकिन प्रत्येक घटक आसानी से परीक्षण योग्य है और यह सर्वरों पर स्केल करता है।

मैंने एक PHP library एक साथ रखा है जो वास्तुकला का निर्माण करने में मेरी सहायता करता है। यह मूल पाइपलाइनिंग है जो तुल्यकालिक और असीमित प्रक्रियाओं के मिश्रण की अनुमति देता है। Async काम कतार और semaphore द्वारा संभाला जाता है। अनुक्रम में होने वाली एपीआई कॉल प्रत्येक को Process कक्षा प्राप्त होगी। एपीआई कॉल जो समवर्ती रूप से MultiProcess कक्षा में जा सकते हैं। एक ProcessList पाइपलाइन सेट अप करता है।

1

यह कुछ php अच्छा नहीं है, और आप इसे आसानी से एज-केस क्रैश बग ढूंढ सकते हैं, लेकिन php multithreading कर सकते हैं - php pthreads और pcntl_fork देखें। (इनमें से कोई भी php-fpm/mod_php, btw, और pcntl_fork के पीछे वेबसर्वर पर काम करता है, केवल यूनिक्स सिस्टम (लिनक्स/बीएसडी) पर काम करता है, विंडोज़ काम नहीं करेगा)

हालांकि, आप शायद बेहतर हो जाएंगे एक मास्टर प्रक्रिया में स्विचिंग -> कार्यकर्ता प्रक्रिया proc_open & सह के साथ मॉडल प्रक्रिया करता है। यह php-fpm और mod_php दोनों में webservers के पीछे काम करता है और यह स्थापित नहीं होने पर पाथ्रेड स्थापित करने पर भी निर्भर करता है और यहां तक ​​कि विंडोज़ पर भी काम करता है, और यदि कोई एकल कार्यकर्ता दुर्घटनाग्रस्त हो जाता है तो अन्य श्रमिकों को क्रैश नहीं करेगा। आप भी php के curl_multi इंटरफ़ेस का उपयोग कर ड्रॉप कर सकते हैं (जो आईएमओ सही होने के लिए बहुत बोझिल है), और सरल curl_exec & सह फ़ंक्शंस का उपयोग करते रहें। (यहाँ pinghttps://gist.github.com/divinity76/f5e57b0f3d8131d5e884edda6e6506d7 के कई उदाहरण चलाने के लिए एक उदाहरण है - लेकिन मैं इस बात के लिए php CLI उपयोग करने का सुझाव कर रहा हूँ, proc_open('php workerProcess.php',...); जैसे, मैं इसे कई बार किया है इससे पहले कि सफलता के साथ।)

2

हाँ, आप कर सकते हैं।

उनमें से अधिकतर HTTP क्लाइंट (उदा: guzzle, httpful) का उपयोग करें, उनमें से अधिकतर PSR7 का पालन कर रहे हैं, इससे पहले कि आपके पास अनुबंध होगा। सबसे महत्वपूर्ण बात यह है कि उनके पास SOAP और REST के लिए बहुत सारे प्लगइन हैं।

EX: यदि आप अपने HTTP क्लाइंट के रूप में गोजल चुनते हैं तो इसमें SOAP प्लगइन हैं। आप जानते हैं कि आरईएसटी एक सेवा कॉल करने के बारे में है, इसलिए इसके लिए आपको अतिरिक्त पैकेज की आवश्यकता नहीं है, केवल गोज़ल का उपयोग करें।

** अपने एपीआई कॉल को एसिंक मार्ग (गैर-अवरुद्ध) में लिखें जो प्रदर्शन को बढ़ाएगा। एक समाधान आप promises

Read more

0

आप crontab के साथ एक cronjob.php चलाने के लिए और अतुल्यकालिक रूप से अन्य php स्क्रिप्ट शुरू कर सकता है:

// cronjob.php 
$files = [ 
    'soap-client-1.php', 
    'soap-client-2.php', 
    'soap-client-2.php', 
]; 

foreach($files as $file) { 
    $cmd = sprintf('/usr/bin/php -f "%s" >> /dev/null &', $file); 
    system($cmd); 
} 

साबुन-ग्राहक-1.php

$client = new SoapClient('http://www.webservicex.net/geoipservice.asmx?WSDL'); 

$parameters = array(
    'IPAddress' => '8.8.8.8', 
); 
$result = $client->GetGeoIP($parameters); 
// @todo Save result 

प्रत्येक PHP स्क्रिप्ट एक नया सोप अनुरोध शुरू होता है और परिणाम डेटाबेस में स्टोर करता है। अब आप डेटाबेस से परिणाम पढ़ने के द्वारा डेटा को संसाधित कर सकते हैं।

0

यह एक आर्किटेक्चर समस्या की तरह लगता है। आपको प्रत्येक सेवा को एक अलग फ़ाइल/यूआरएल के साथ उपभोग करना चाहिए और जेएसओएन को एचटीएमएल 5/जेएस फ्रंट एंड में स्क्रैप करना चाहिए। इस तरह, आपकी सेवा को कई असीमित हिस्सों में विभाजित किया जा सकता है और प्रत्येक की गति को अलग से tweaked किया जा सकता है।

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