इस पोस्ट में हम सीखेंगे कि सिम्फनी कमांड के निष्पादन को संभालने के लिए पर्यवेक्षक का उपयोग कैसे करें। मूलतः, पर्यवेक्षक हमें इसकी अनुमति देगा:
कभी-कभी हम प्रक्रियाओं के निष्पादन को स्वचालित करने के लिए यूनिक्स क्रॉस्टैब का सहारा लेते हैं। यह अधिकांश समय काम कर सकता है लेकिन ऐसी स्थितियाँ भी हो सकती हैं जहाँ यह समस्याएँ पैदा कर सकता है।
आइए कल्पना करें कि हमारे पास एक डेटाबेस तालिका है जो उपयोगकर्ताओं की सूचनाओं को लॉग करती है। तालिका निम्नलिखित जानकारी संग्रहीत करती है:
दूसरी ओर, हमने एक कमांड को कोड किया है जिसका निष्पादन अगले चरणों का पालन करता है:
हमने इस कमांड को लिनक्स क्रॉस्टैब में समय-समय पर चलाने के लिए सेट किया है (1 मिनट, 2 मिनट आदि)। अब तक तो सब ठीक है।
अब कल्पना करें कि वर्तमान प्रक्रिया में 500 सूचनाएं मांगी गई हैं और जब उसने 400 सूचनाएं भेजी हैं, तो एक नई प्रक्रिया शुरू होती है। इसका मतलब यह है कि नई प्रक्रिया उन 100 सूचनाओं पर सवाल उठाएगी जिन्हें पिछली प्रक्रिया के साथ-साथ नई प्रक्रियाओं द्वारा अभी तक अपडेट नहीं किया गया है:
इससे उन 100 सूचनाओं को दो बार भेजा जा सकता है क्योंकि दोनों प्रक्रियाओं ने उनसे पूछताछ की है।
समाधान के रूप में, हम पर्यवेक्षक का उपयोग कर सकते हैं। यह हमारी प्रक्रिया को चालू रखेगा और आवश्यकता पड़ने पर इसे पुनः आरंभ करेगा। इस तरह, हम केवल एक प्रक्रिया रखते हैं और ओवरलैप से बचते हैं। आइए विश्लेषण करें कि कमांड कैसा दिखना चाहिए:
#[AsCommand( name: 'app:notification' )] class NotificationCommand extends Command { private bool $forceFinish = false; protected function configure(): void { $this ->addOption('time-limit', null, InputOption::VALUE_OPTIONAL, 'Max time alive in seconds') ->addOption('time-between-calls', null, InputOption::VALUE_OPTIONAL, 'Time between every loop call') ; } protected function execute(InputInterface $input, OutputInterface $output): int { $this->forceFinish = false; pcntl_signal(SIGTERM, [$this, 'signalHandler']); pcntl_signal(SIGINT, [$this, 'signalHandler']); $timeLimit = $input->getOption('time-limit'); $timeBetweenCalls = $input->getOption('time-between-calls'); $dtMax = (new \DateTimeImmutable())->add(\DateInterval::createFromDateString(" {$timeLimit} seconds")); do{ // Here we should execute a service to query and send notifications // ...... sleep($timeBetweenCalls); $dtCurrent = new \DateTimeImmutable(); }while($dtCurrent forceFinish); return Command::SUCCESS; } public function signalHandler(int $signalNumber): void { echo 'Signal catch: ' . $signalNumber . PHP_EOL; match ($signalNumber) { SIGTERM, SIGINT => $this->forceFinish = true, default => null }; } }
आइए कमांड को चरण दर चरण समझाएं:
configure विधि इनपुट विकल्पों की घोषणा करती है:
execute विधि इस प्रकार व्यवहार करती है:
फ़ंक्शन SIGTERM और SIGINT यूनिक्स सिग्नल पकड़ता है। जब हम Ctrl C दबाते हैं तो SIGINT सिग्नल भेजा जाता है और जब हम किल कमांड का उपयोग करते हैं तो SIGTERM डिफ़ॉल्ट सिग्नल होता है। जब signalHandler फ़ंक्शन उनका पता लगाता है, तो यह forceFiish वेरिएबल को सत्य पर सेट करता है, ताकि, जब वर्तमान लूप समाप्त हो जाए, तो कमांड समाप्त हो जाएगा क्योंकि forceFiish वेरिएबल है अब झूठ नहीं है. यह उपयोगकर्ताओं को अधिकतम तिथि समाप्त होने तक प्रतीक्षा किए बिना प्रक्रिया को समाप्त करने की अनुमति देता है।
sudo apt update && sudo apt इंस्टॉल पर्यवेक्षक
sudo apt update && sudo apt install supervisor
sudo systemctl स्थिति पर्यवेक्षक
sudo systemctl status supervisor/etc/supervisor/conf.d
। आइए notif.conf नामक एक फ़ाइल बनाएं और निम्नलिखित सामग्री पेस्ट करें:
कमांड=php
command=php/bin/console app:notifications --time-limit=120 --time-between-calls=10 user= numprocs=1 autostart=true autorestart=true process_name=%(program_name)s_%(process_num)02d
कमांड अधिकतम 120 सेकंड तक चलेगा और, यह प्रत्येक लूप के बाद 10 सेकंड के दौरान सो जाएगा। 120 सेकंड बीतने या यूनिक्स सिग्नल को कैश करने के बाद, कमांड लूप से बाहर निकल जाएगा और समाप्त हो जाएगा। फिर, पर्यवेक्षक इसे फिर से शुरू करेगा। निष्कर्ष
मैंने जो आखिरी किताब लिखी थी, उसमें मैंने दिखाया था कि सिम्फनी मैसेंजर कर्मियों को चालू रखने के लिए पर्यवेक्षक का उपयोग कैसे किया जाए। यदि आप अधिक जानना चाहते हैं, तो आप यहां पुस्तक पा सकते हैं: PHP और सिम्फनी फ्रेमवर्क का उपयोग करके एक ऑपरेशन-ओरिएंटेड एपीआई का निर्माण: एक चरण-दर-चरण मार्गदर्शिका
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3