"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > सिम्फनी कमांड निष्पादन को संभालने के लिए पर्यवेक्षक का उपयोग करना

सिम्फनी कमांड निष्पादन को संभालने के लिए पर्यवेक्षक का उपयोग करना

2024-11-01 को प्रकाशित
ब्राउज़ करें:313

परिचय

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

  • कमांड को ऑटोस्टार्ट करें
  • कमांड को ऑटोरेस्टार्ट करें
  • उन प्रक्रियाओं की संख्या निर्दिष्ट करें जिन्हें हम पर्यवेक्षक से शुरू करवाना चाहते हैं।

समस्या

कभी-कभी हम प्रक्रियाओं के निष्पादन को स्वचालित करने के लिए यूनिक्स क्रॉस्टैब का सहारा लेते हैं। यह अधिकांश समय काम कर सकता है लेकिन ऐसी स्थितियाँ भी हो सकती हैं जहाँ यह समस्याएँ पैदा कर सकता है।

आइए कल्पना करें कि हमारे पास एक डेटाबेस तालिका है जो उपयोगकर्ताओं की सूचनाओं को लॉग करती है। तालिका निम्नलिखित जानकारी संग्रहीत करती है:

  • उपयोगकर्ता
  • मूलपाठ
  • चैनल
  • स्थिति (प्रतीक्षा, भेजा गया)
  • createdAt
  • अद्यतन

दूसरी ओर, हमने एक कमांड को कोड किया है जिसका निष्पादन अगले चरणों का पालन करता है:

  • अंतिम प्रतीक्षा सूचनाओं को क्वेरी करता है
  • पूछे गए नोटिफिकेशन को लूप करता है और:
    • प्रत्येक को संबंधित उपयोगकर्ता को भेजता है।
    • अधिसूचना स्थिति को प्रतीक्षा से भेज तक अद्यतन करता है

हमने इस कमांड को लिनक्स क्रॉस्टैब में समय-समय पर चलाने के लिए सेट किया है (1 मिनट, 2 मिनट आदि)। अब तक तो सब ठीक है।

अब कल्पना करें कि वर्तमान प्रक्रिया में 500 सूचनाएं मांगी गई हैं और जब उसने 400 सूचनाएं भेजी हैं, तो एक नई प्रक्रिया शुरू होती है। इसका मतलब यह है कि नई प्रक्रिया उन 100 सूचनाओं पर सवाल उठाएगी जिन्हें पिछली प्रक्रिया के साथ-साथ नई प्रक्रियाओं द्वारा अभी तक अपडेट नहीं किया गया है:

Using Supervisor to handle a Symfony Command execution

इससे उन 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 विधि इस प्रकार व्यवहार करती है:

    • forceFining क्लास वेरिएबल को true पर सेट करता है
    • यूनिक्स SIGTERM सिग्नलों को संभालने के लिए विधि signalHandler को पंजीकृत करने के लिए PHP pnctl लाइब्रेरी का उपयोग करता है। इनपुट विकल्प मान प्राप्त करता है और अधिकतम तिथि की गणना करता है कि कमांड
    • time-limit
    • विकल्प मान का उपयोग करने तक सक्रिय रह सकता है। डू-व्हाइल लूप सूचनाएं प्राप्त करने और उन्हें भेजने के लिए आवश्यक कोड निष्पादित करता है (इसे कमांड में नहीं रखा गया है, इसके बजाय टिप्पणियां हैं)। फिर, यह जारी रखने से पहले
    • time-between-calls
    • विकल्प द्वारा स्थापित समय सोता है। यदि वर्तमान तिथि (जो प्रत्येक लूप पुनरावृत्ति में गणना की जाती है) अधिकतम तिथि से कम है और
    • forceFiish
    • गलत है, तो लूप जारी रहता है। अन्यथा आदेश समाप्त हो जाता है।
  • signalHandler

    फ़ंक्शन 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 /bin/console ऐप: नोटिफिकेशन --टाइम-लिमिट=120 --टाइम-बीच-कॉल्स=10 उपयोगकर्ता= numprocs=1 ऑटोस्टार्ट = सत्य स्वतः पुनः आरंभ = सत्य प्रक्रिया_नाम=%(प्रोग्राम_नाम)s_%(process_num)02d

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

    कमांड
  • : प्रारंभ करने का आदेश
  • उपयोगकर्ता
  • : यूनिक्स उपयोगकर्ता जो कमांड चलाता है
  • numprocs
  • : चलाने के लिए प्रक्रियाओं की संख्या
  • ऑटोस्टार्ट
  • : कमांड को ऑटोस्टार्ट करना है या नहीं
  • ऑटोस्टार्ट
  • : क्या ऑटोरीस्टार्ट कमांड करना है
  • process_name
  • : कमांड यूनिक्स प्रक्रिया नाम प्रारूप।
  • इस कॉन्फ़िगरेशन के साथ,
app:notifications

कमांड अधिकतम 120 सेकंड तक चलेगा और, यह प्रत्येक लूप के बाद 10 सेकंड के दौरान सो जाएगा। 120 सेकंड बीतने या यूनिक्स सिग्नल को कैश करने के बाद, कमांड लूप से बाहर निकल जाएगा और समाप्त हो जाएगा। फिर, पर्यवेक्षक इसे फिर से शुरू करेगा। निष्कर्ष

हमने सीखा है कि क्रोंटैब का उपयोग किए बिना कमांड को चालू रखने के लिए पर्यवेक्षक का उपयोग कैसे करें। यह तब उपयोगी हो सकता है जब क्रॉस्टैब द्वारा लॉन्च की गई प्रक्रियाएं ओवरलैप हो सकती हैं, जिससे डेटा भ्रष्टाचार हो सकता है।

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

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/icolomina/using-supervisor-to-handle-a-symfony-command-execution-41h7?1 यदि कोई उल्लंघन है, तो कृपया हटाने के लिए स्टडी_गोलंग@163.com पर संपर्क करें यह
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3