2012-07-06 35 views
17

में कतार प्रसंस्करण को कैसे कार्यान्वित करूं, मैं चाहता हूं कि मेरे क्लाइंट (पोस्ट के माध्यम से) को एक कतार में रखा गया डेटा और मेरे सर्वर पर एक php स्क्रिप्ट पहले जांच करे कि कतार खाली है या नहीं। यदि कतार खाली नहीं है, तो स्क्रिप्ट कतार में सभी डेटा एक-एक करके संसाधित करेगी.मैं यह कैसे करूँ?PHP मैं php

+0

डेटा जमा करने के लिए डेटाबेस में एक टेबल बनाएं, और उसके बाद इसे लेने के लिए कभी भी crontab नौकरियां चलाएं? – BugFinder

+0

हां। मुझे यह दृष्टिकोण पसंद है। लेकिन तालिका में कार्य डालने के बाद, कार्य पूरा होने पर कार्य को कैसे प्राप्त किया जाए और तालिका को अपडेट कैसे किया जाए? – ASHUTOSH

+0

प्रक्रिया के लिए एक कार्य चलाने के लिए cronjob का बिंदु था, डीबी तक पहुंचें और इसे अपडेट करें – BugFinder

उत्तर

3

this पर एक नज़र डालें।

यह दृढ़ता के लिए memcached का उपयोग करता है।

7

आप Zero MQ

की तरह कुछ इस्तेमाल कर सकते हैं Example by Rasmus Lerdorf देखें।

आप लोड वितरित करने के लिए Gearman का उपयोग करने पर भी विचार कर सकते हैं।

http://squirrelshaterobots.com/programming/php/building-a-queue-server-in-php-part-1-understanding-the-project/

अन्य समाधान Gearman उपयोग कर रहा है जो वे (पिछली बार मैं इसके साथ खेला नहीं था) पीएचपी में शामिल हैं लगता है: http://php.net/manual/en/book.gearman.php

1

यहाँ इस के लिए एक और महान ट्यूटोरियल है

1

cronjob दृष्टिकोण के साथ समस्या है, cronjob सबसे अधिक सेट पर 1 मिनट अंतराल पर हो सकता है, इसलिए नौकरी निष्पादन में 1 मिनट की देरी हो रही है, अगर यह स्वीकार्य है तो यह ठीक है अन्यथा मतदान स्क्रिप्ट के साथ कतार का उपयोग करना चाहिए।

0

चूंकि संबंध डीबी (एक्स: माईएसक्यूएल) बहुत ही लचीला है, और वेब डेवलपर्स द्वारा अच्छी तरह से समझ में आता है, इसलिए वे कई प्रकार की नौकरी कतारों के लिए उपयोग किए जाते हैं। ऑब्जेक्ट कैशिंग असुरक्षित होने पर कई PHP अनुप्रयोग इस समाधान का उपयोग फ़ॉलबैक के रूप में करते हैं। यह अंतिम उपाय का तरीका है क्योंकि यह एक कतार लागू करने का एक बहुत महंगा तरीका है।

यदि आपको अपनी कतार के रूप में MySQL का उपयोग करना होगा, तो पेकोना इंजीनियरों में से एक ने संभावित दर्द बिंदुओं के प्रबंधन पर यह blog entry लिखा था।

यदि आप सबसे अधिक स्केलेबल कार्यान्वयन चाहते हैं, तो मैं ज़ीरोएमक्यू की अत्यधिक अनुशंसा करता हूं। हालांकि यह एक डिफ़ॉल्ट, या विशेष रूप से आम नहीं है, PHP विस्तार। तो एक ऐसे प्रोजेक्ट के लिए जहां आप वेब सर्वर स्टैक को नियंत्रित नहीं करेंगे: एपीसी ऑब्जेक्ट्स, मेमकेचे या मेमकैच का उपयोग करें, और उसके बाद एक MySQL कैश तालिका में फ़ॉलबैक करें।

4

यह ऐसा कुछ है जो आप आसानी से enqueue लाइब्रेरी के साथ कर सकते हैं। सबसे पहले, आप विभिन्न प्रकार के transports, जैसे कि एएमक्यूपी, एसटीओएमपी, रेडिस, अमेज़ॅन एसक्यूएस, फाइलसिस्टम आदि से चुन सकते हैं।

दूसरा, यह उपयोग करने में बहुत आसान है। आइए इंस्टॉलेशन से शुरू करें:

आपको enqueue/simple-client लाइब्रेरी और one of the transports इंस्टॉल करना होगा। मान लें कि आप फाइल सिस्टम को चुनते हैं, enqueue/fs लाइब्रेरी इंस्टॉल करें।संक्षेप में:

composer require enqueue/simple-client enqueue/fs 

आइए अब देखते हैं कि कैसे आप अपनी पोस्ट स्क्रिप्ट से संदेश भेज सकते हैं: का उपयोग करके

<?php 
// consumer.php 

use Enqueue\SimpleClient\SimpleClient; 
use Enqueue\Psr\PsrProcessor; 
use Enqueue\Psr\PsrMessage; 

include __DIR__.'/vendor/autoload.php'; 

$client = new SimpleClient('file://'); 

$client->bind('a_topic', 'a_processor_name', function(PsrMessage $psrMessage) { 
    // processing logic here 

    return PsrProcessor::ACK; 
}); 

// this call is optional but it worth to mention it. 
// it configures a broker, for example it can create queues and excanges on RabbitMQ side. 
$client->setupBroker(); 

$client->consume(); 

भागो के रूप में कई consumer.php आप के रूप में प्रक्रियाओं:

<?php 
// producer.php 

use Enqueue\SimpleClient\SimpleClient; 

include __DIR__.'/vendor/autoload.php'; 

$client = new SimpleClient('file://'); // the queue will store messages in tmp folder 

$client->sendEvent('a_topic', 'aMessageData'); 

खपत स्क्रिप्ट स्थानीय कंप्यूटर पर supervisord या अन्य प्रक्रिया प्रबंधक, आप बिना किसी अतिरिक्त libs या संकुल के इसे चला सकते हैं।

यह एक मूल उदाहरण है और एनक्यू में कई अन्य सुविधाएं हैं जो काम में आ सकती हैं। यदि आप रुचि रखते हैं, तो enqueue documentation देखें।