बैच एपीआई आंतरिक रूप से कैसे काम करता है?


19

मैं दूसरे दिन माइग्रेट का उपयोग करके टाइमआउट मुद्दे में भाग गया और आश्चर्यचकित था कि बैच एपीआई आंतरिक रूप से कैसे काम करता है।

जिस तरह से मैं इसे समझता हूं वह यह है कि अपने सबसे सरल रूप में आप एक मान मान लेंगे (उदाहरण के लिए nids) और उन मूल्यों पर काम करने के लिए एक फ़ंक्शन। बैच API तब प्रत्येक अनुरोध के साथ उन मानों की निश्चित संख्या को संसाधित करता है, जब तक कि यह समाप्त नहीं हो जाता।

जब एक बैच चल रहा होता है तो पेज ऑपरेशन (% किया और संदेश) की प्रगति को दिखाने के लिए अजाक्स अनुरोध का उपयोग करने लगता है। मुझे लगता है कि यह इंतजार करता है जब तक कि प्रगति को अद्यतन करने के लिए अनुरोध समाप्त नहीं हुआ है और फिर अगले अनुरोध को तुरंत बाद में शुरू करना है?

यदि बैच अनुरोध वाला पृष्ठ बंद है तो क्या बैच प्रसंस्करण बंद हो जाता है? क्या उसी URL को दोबारा खोलने पर यह पुनः आरंभ होगा? माइग्रेट मॉड्यूल कभी-कभी जारी रहता है लेकिन यह संभवतः कतारों का उपयोग कर रहा है?

जवाबों:


40

यह बैच कैसे काम करता है (मेरी समझ के आधार पर)

1. आरंभ

  1. बैच प्रसंस्करण शुरू करो। जावास्क्रिप्ट सक्षम है या नहीं, इस पर क्लाइंट (ब्राउजर) कॉन्फ़िगरेशन के आधार पर।
  2. जावास्क्रिप्ट-सक्षम क्लाइंट को drupal.js में 'has_js' कुकी सेट द्वारा पहचाना जाता है। यदि वर्तमान उपयोगकर्ता के ब्राउज़र सत्र के दौरान कोई जावास्क्रिप्ट-सक्षम पृष्ठ का दौरा नहीं किया गया है, तो गैर-जावास्क्रिप्ट संस्करण वापस आ जाता है।
  3. यदि जावास्क्रिप्ट सक्षम बैच बैच ajax अनुरोध का उपयोग करता है कनेक्शन भर में जीवित रखें।
  4. यदि जावास्क्रिप्ट सक्षम नहीं है, तो बैच उपयोग करता है HTML में एक मेटा टैग सेट करता है ताकि अनुरोध के दौरान कनेक्शन को जीवित रखने के लिए नियमित रूप से ताज़ा अंतराल बनाया जा सके।

(यह है कि जॉब डोन की प्रगति पर प्रगति बार को कैसे अपडेट किया जाता है।)

बैच प्रक्रिया

  1. प्रक्रिया शुरू करने के लिए, बैच एक कतार बनाता है और सभी ऑपरेशन (फ़ंक्शन और तर्क) जोड़ता है जिसे आप बैच सरणी में परिभाषित करते हैं, जैसे

    $batch = array (
    'operations' => array(
      array('batch_example_process', array($options1, $options2)),
      array('batch_example_process', array($options3, $options4)),
      ),
    'finished' => 'batch_example_finished',
    'title' => t('Processing Example Batch'),
    'init_message' => t('Example Batch is starting.'),
    'progress_message' => t('Processed @current out of @total.'),
    'error_message' => t('Example Batch has encountered an error.'),
    'file' => drupal_get_path('module', 'batch_example') . '/batch_example.inc',
    );

    इसके अतिरिक्त यह एक बैच आईडी भी प्रदान करता है जो बैचों में अद्वितीय है।

  2. अब बैच कॉल एक-एक करके क्यू आइटम का दावा करती है और इसमें परिभाषित तर्कों के साथ परिभाषित फ़ंक्शन को निष्पादित करती है।

  3. यह एक महत्वपूर्ण हिस्सा है, फ़ंक्शन (ऑपरेशन) जो बैच ऑपरेशन को कार्यान्वित करता है, उसे डेटा को चाक करना चाहिए और PHP की मेमोरी सीमा, टाइम आउट को ध्यान में रखते हुए डेटा को बहुत कुशलता से संसाधित करना चाहिए । ऐसा करने में आपकी समस्या खत्म हो जाएगी।

मैं दूसरे दिन माइग्रेट का उपयोग करके टाइमआउट मुद्दे में भाग गया और आश्चर्यचकित करने लगा कि बैच एपीआई आंतरिक रूप से कैसे काम करता है।

बैच समारोह

बैच को लागू करने वाले कार्यों में निम्नलिखित बातों का ध्यान रखना चाहिए,

  • कार्रवाई करने के लिए कार्रवाई के भीतर आइटम की संख्या,

    if (!isset($context['sandbox']['progress'])) {
    $context['sandbox']['progress'] = 0;
    $context['sandbox']['current_node'] = 0;
    $context['sandbox']['max'] = db_result(db_query('SELECT COUNT(DISTINCT nid) FROM {node}'));
    }
  • एक फंक्शन कॉल में प्रोसेस करने के लिए आइटमों की संख्या को सीमित करना जैसे एक लिमिट सेट करना,

    // For this example, we decide that we can safely process 5 nodes at a time without a timeout.
    $limit = 5;
  • प्रक्रिया के बाद की प्रक्रिया पर अपडेट जैसे,

    // Update our progress information.
        $context['sandbox']['progress']++;
        $context['sandbox']['current_node'] = $node->nid;
        $context['message'] = t('Now processing %node', array('%node' => $node->title));
  • बैच इंजन को सूचित करना कि बैच पूरा हुआ है या नहीं,

    // Inform the batch engine that we are not finished,
    // and provide an estimation of the completion level we reached.
    if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
      $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
     }

ऊपर दिए गए अधिकांश बिंदुओं को ड्रुपल के कोर बैच ऑपरेशंस का ध्यान रखा जाता है, यदि यह कार्यान्वयन फ़ंक्शन में मिस्ड है। लेकिन कार्यान्वयन फ़ंक्शन में परिभाषित करना हमेशा सबसे अच्छा होता है

बैच समाप्त कॉलबैक

  • यह अंतिम कॉल बैक है जिसे बैच एरे में परिभाषित किया जाता है आमतौर पर कितना संसाधित किया जाता है आदि की रिपोर्ट ...

जवाब

यदि बैच अनुरोध वाला पृष्ठ बंद है तो क्या बैच प्रसंस्करण बंद हो जाता है? क्या फिर से वही url खोले जाने पर पुनः आरंभ होगा? माइग्रेट मॉड्यूल कभी-कभी जारी रहता है लेकिन यह संभवतः कतारों का उपयोग कर रहा है?

हां, आदर्श रूप में इसे बैच को पुनरारंभ करना चाहिए और जैसा कि ऊपर कहा गया है कि यह आपके द्वारा लागू किए गए फ़ंक्शन पर आधारित है।

PHP टाइम की अपनी समस्या को हल करने के लिए Drush बैच का उपयोग करें जो माइग्रेट मॉड्यूल में उपलब्ध है, लेकिन पहले माइग्रेट बैच के कार्यों को खोदें और अपने प्रोसेसिंग डेटा को चेंक करने का प्रयास करें।


1
भयानक चलना। मैं यह भी बताना चाहूंगा कि बैच उपयोगकर्ता के दौरान कम से कम, के दौरान प्रसंस्करण शुरू करता है, "प्रारंभिक" प्रतीत होता है। स्क्रीन। यही है, अगर सेट करने के लिए 4 सेकंड लगते हैं और पहले बैच आइटम को संसाधित करने में 10 सेकंड लगते हैं, तो उपयोगकर्ता प्रक्रिया को "सक्रिय करना" देखेंगे। इस उदाहरण में चौदह सेकंड के लिए। यह समझ में आता है क्योंकि पहला गैर-init स्क्रीन संदेश "n पूर्ण" है जो कुछ संसाधित होने के बाद ही काम करेगा। यदि यह गलत है, तो कृपया मुझे सुधारें!
टेक्सस-ब्रोंस

इसके अलावा, मेरे अनुभव से। यदि आप पृष्ठ को छोड़ते हैं तो बैच ऑपरेशन / चंक जो प्रक्रिया में है, अभी भी संसाधनों का उपभोग करेगा जब तक कि यह पूरा नहीं हो जाता। यह किसी भी बैच की नौकरी से आग नहीं लगाता है लेकिन यह वर्तमान को पूरा करता है।
एलिजा लिन

10

यदि बैच अनुरोध वाला पृष्ठ बंद है तो क्या बैच प्रसंस्करण बंद हो जाता है?

हां, इसे रोका जाएगा।

क्या फिर से वही url खोले जाने पर पुनः आरंभ होगा? माइग्रेट मॉड्यूल कभी-कभी जारी रहता है लेकिन यह संभवतः कतारों का उपयोग कर रहा है?

जैसा कि दिनेश ने कहा कि यह कार्यान्वयन पर निर्भर करता है।

आपको ड्रश का उपयोग करके माइग्रेशन चलाना चाहिए, क्योंकि

ड्रश कमांड लाइन पर चलता है और किसी भी समय सीमा के अधीन नहीं है (विशेष रूप से, PHP का max_execution_time लागू नहीं होता है)। इसलिए, जब आप ड्रश के माध्यम से चलने वाली माइग्रेशन प्रक्रिया शुरू करते हैं, तो यह बस शुरू हो जाती है और तब तक चलती रहती है जब तक यह पूरा नहीं हो जाता।

जब एक वेब इंटरफ़ेस के माध्यम से प्रक्रियाएं चल रही हैं, तो PHP max_execution_time (आमतौर पर 30 सेकंड यदि कम नहीं है) लागू होता है। इस प्रकार, लंबे समय तक चलने वाली प्रक्रियाओं के लिए हमें बैच एपीआई का उपयोग करने की आवश्यकता होती है, जो कई अनुरोधों के दौरान एक प्रक्रिया को तोड़ने का प्रबंधन करता है। तो, एक माइग्रेशन प्रक्रिया शुरू हो जाएगी, 25 सेकंड या तो चलेगा, फिर रुकें और बैच एपीआई को एक ताज़ा पृष्ठ अनुरोध जारी करने दें, जिसमें माइग्रेशन प्रक्रिया फिर से शुरू हो, विज्ञापन infinitum।

तो, यह समझना कि, ड्रश बेहतर क्यों है?

यह तेज है

बैच एपीआई बहुत सारे ओवरहेड का परिचय देता है - पृष्ठ अनुरोधों को बंद करने और फिर से शुरू करने के लिए, माइग्रेशन प्रक्रिया को सभी आवश्यक कंस्ट्रक्टरों के माध्यम से फिर से चलाने की आवश्यकता होती है, डेटाबेस कनेक्शन पुन: स्थापित किए जाते हैं और फिर से पूछताछ करते हैं, आदि, और आंशिक आयात के लिए, इसे चुनने की आवश्यकता होती है। ऊपर जहां इसे छोड़ दिया गया है - यदि पहले 500 स्रोत रिकॉर्ड आयात किए गए हैं, तो इसे 501 वां रिकॉर्ड खोजने की आवश्यकता है। आपके स्रोत प्रारूप और उसके निर्माण के आधार पर, यह पैमाना हो सकता है या नहीं - यदि आप किसी SQL स्रोत के साथ उच्च पानी के निशान का उपयोग कर रहे हैं, तो क्वेरी स्वयं ही पहले के रिकॉर्ड को समाप्त कर सकती है और वहीं शुरू कर सकती है जहां आपने छोड़ा था। यदि नहीं, तो माइग्रेट को पहले गैर-आयातित रिकॉर्ड की तलाश में स्रोत डेटा के माध्यम से स्क्रॉल करने की आवश्यकता होती है। कहते हैं, अपने स्रोत के रूप में एक बड़ी XML फ़ाइल,

यह अधिक विश्वसनीय है

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

यह अधिक सहायक है

यदि ड्रश में दौड़ते समय कुछ गलत हो जाता है, यदि कोई उपयोगी त्रुटि संदेश है तो आप उन्हें देखेंगे। बैच एपीआई का उपयोग करने में विफलताएं अक्सर निगल ली जाती हैं और आपको जो कुछ भी देखने को मिलता है वह पूरी तरह से बेकार है "एक AJAX HTTP अनुरोध असामान्य रूप से समाप्त हो गया है। जानकारी का अनुसरण करता है। पथ: / बैच? आईडी = 901 और op = क्या स्थिति स्थिति: प्रतिक्रिया: पाठ: तैयार: 4"।

आप इस बारे में अधिक जानकारी पा सकते हैं यहाँ

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

यह मॉड्यूल मौजूदा बैच एपीआई को लेता है और एक पृष्ठभूमि प्रक्रिया में बैच की नौकरियों को चलाता है। इसका मतलब यह है कि यदि आप बैच पेज को छोड़ देते हैं, तो नौकरियां जारी रहती हैं, और आप बाद में प्रगति संकेतक पर लौट सकते हैं।


वाह, माइग्रेट करने के लिए ड्रश का उपयोग करने से भारी सुधार हुआ। मुझे एक लाइव साइट में माइग्रेट करना है और यह सिस्टम पर बहुत कम लोड डालता है! धन्यवाद!
Uwe

0

बैच एपीआई को ध्यान से समझें और ये मॉड्यूल आपकी मदद करेंगे:

1- प्रस्तावक यह किसी भी प्रगति का ट्रैक रखने के लिए एक सामान्य रूपरेखा को लागू करने का एक प्रयास है

2- बैकग्राउंड प्रगति मौजूदा बैच एपीआई पर ले जाती है और बैकग्राउंड प्रॉसेस में बैच की नौकरियां चलती हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.