ব্যাচ এপিআই অভ্যন্তরীণভাবে কীভাবে কাজ করে?


19

আমি অন্য দিন মাইগ্রেশন ব্যবহার করে একটি সময়সীমা ইস্যুতে ছুটে এসেছি এবং ভাবতে শুরু করেছিলাম কীভাবে ব্যাচ এপিআই অভ্যন্তরীণভাবে কাজ করে।

আমি এটি যেভাবে বুঝতে পারি তা হ'ল এটির সহজতম ফর্মে আপনি মানগুলির একটি অ্যারে (উদাহরণস্বরূপ এনআইডি) এবং সেই মানগুলিতে পরিচালনা করার জন্য একটি ফাংশন পাস করবেন। ব্যাচ এপিআই এর পরে প্রতিটি অনুরোধের সাথে শেষ হওয়া অবধি এই মানগুলির একটি নির্দিষ্ট সংখ্যক প্রক্রিয়া করে।

যখন কোনও ব্যাচটি চলমান থাকে তখন ব্যাচ অপারেশনের অগ্রগতি (% সম্পন্ন এবং বার্তাগুলি) দেখানোর জন্য অ্যাজাক্স অনুরোধগুলি ব্যবহার করা মনে হয়। আমি ধরে নিয়েছি অনুরোধটি অগ্রগতি আপডেট করতে শেষ না হওয়া পর্যন্ত অপেক্ষা করে এবং তারপরে পরবর্তী অনুরোধটি তত্ক্ষণাত শুরু করে?

ব্যাচের অনুরোধ সহ পৃষ্ঠাটি বন্ধ থাকলে কি ব্যাচ প্রক্রিয়াজাতকরণ বন্ধ হবে? একই ইউআরএল আবার খোলার পরে কি এটি পুনরায় চালু হবে? স্থানান্তর মডিউলটি মাঝে মাঝে চলতে থাকে তবে এটি সম্ভবত সারি ব্যবহার করে?

উত্তর:


40

ব্যাচটি এইভাবে কাজ করে (আমার বোঝার ভিত্তিতে)

1. সূচনা

  1. ব্যাচ প্রসেসিং শুরু করুন। জাভাস্ক্রিপ্ট সক্ষম আছে কি না সে সম্পর্কে ক্লায়েন্টদের (ব্রাউজারগুলি) কনফিগারেশনের উপর ভিত্তি করে।
  2. জাভাস্ক্রিপ্ট-সক্ষম ক্লায়েন্টদের drupal.js এ সেট 'has_js' কুকি দ্বারা চিহ্নিত করা হয়েছে। যদি বর্তমান ব্যবহারকারীর ব্রাউজার অধিবেশন চলাকালীন কোনও জাভাস্ক্রিপ্ট-সক্ষম পৃষ্ঠাটি না দেখা যায় তবে জাভাস্ক্রিপ্ট-বিহীন সংস্করণটি ফিরে আসবে।
  3. যদি JavaScript সক্ষম ব্যাচ ব্যবহারসমূহ Ajax অনুরোধ অনুরোধ জুড়ে জীবিত সংযোগ রাখা।
  4. যদি জাভাস্ক্রিপ্ট সক্ষম না করা থাকে তবে ব্যাচটি অনুরোধটি জুড়েই সংযোগটি বাঁচিয়ে রাখতে নিয়মিত রিফ্রেশ অন্তর তৈরি করতে এইচটিএমএলে একটি মেটা ট্যাগ সেট করে।

(কাজ সম্পন্নের অগ্রগতিতে এভাবেই অগ্রগতি বার আপডেট করা হয়))

ব্যাচ প্রক্রিয়া

  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. এটি একটি অত্যন্ত গুরুত্বপূর্ণ অংশ, ফাংশন (অপারেশন) যা ব্যাচ অপারেশন প্রয়োগ করে তাদের পিএইচপি-র স্মৃতি সীমা, সময়সীমার কথা মাথায় রেখে ডেটাটি সঙ্কুচিত করে এবং ডেটা খুব দক্ষতার সাথে প্রক্রিয়া করা উচিত । এটি করতে ব্যর্থ হওয়া আপনার সমস্যার শেষ হবে।

আমি অন্য দিন মাইগ্রেশন ব্যবহার করে একটি সময়সীমা ইস্যুতে ছুটে এসেছি এবং ভাবতে শুরু করেছিলাম কীভাবে ব্যাচের এপিআই অভ্যন্তরীণভাবে কাজ করে।

ব্যাচ ফাংশন

ব্যাচটি কার্যকর করে এমন ফাংশনগুলি খুব সাবধানে নিম্নলিখিত বিষয়গুলি গ্রহণ করা উচিত,

  • প্রক্রিয়াজাতকরণের মধ্যে আইটেমের সংখ্যা যেমন প্রক্রিয়া করতে পারে,

    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'];
     }

উপরোক্ত পয়েন্টগুলির বেশিরভাগই দ্রুপালের কোর ব্যাচ অপারেশনগুলির যত্ন নেওয়া হয় যদি এটি প্রয়োগকারী ফাংশনে মিস হয়। তবে প্রয়োগকারী ফাংশনে সংজ্ঞায়িত করা সর্বদা সেরা

ব্যাচ সমাপ্ত কলব্যাক

  • ব্যাচের অ্যারেতে সংজ্ঞায়িত হওয়ার পরে এটিই শেষ কলটি ফিরে আসে সাধারণত কতটা প্রক্রিয়াজাতকরণ ইত্যাদির একটি প্রতিবেদন ...

উত্তর

ব্যাচের অনুরোধ সহ পৃষ্ঠাটি বন্ধ থাকলে কি ব্যাচ প্রক্রিয়াজাতকরণ বন্ধ হবে? একই ইউআরএলটি আবার খোলার পরে কি এটি পুনরায় চালু হবে? স্থানান্তর মডিউলটি মাঝে মাঝে চলতে থাকে তবে এটি সম্ভবত সারি ব্যবহার করে?

হ্যাঁ, আদর্শভাবে এটি ব্যাচটি পুনরায় চালু করা উচিত এবং উপরে যেমনটি বলা হয়েছে এটি আপনার বাস্তবায়িত ফাংশনের উপর ভিত্তি করে।

করতে আপনার সমস্যা সমাধানের বাইরে ব্যবহার Drush ব্যাচ যা স্থানান্তরণের মডিউল পাওয়া যায় পিএইচপি টাইম, কিন্তু প্রথম স্থানান্তরণের এর ব্যাচ ক্রিয়াকলাপ আপনার প্রক্রিয়াকরণ ডেটা খনন এবং খণ্ড করার চেষ্টা করুন।


1
ভয়ঙ্কর হাঁটাচলা। আমি আরও উল্লেখ করতে চাই যে ব্যাচটি প্রক্রিয়া শুরু করার সময় কীভাবে ব্যবহারকারীর কাছে কমপক্ষে, এটি "আরম্ভ করা" বলে মনে হয়। পর্দা। এটি হ'ল, যদি প্রথম ব্যাচের আইটেমটি সেট করতে 4 সেকেন্ড এবং 10 সেকেন্ড সময় লাগে তবে ব্যবহারকারী "প্রারম্ভিককরণ" প্রক্রিয়াটি দেখতে পাবেন। এই উদাহরণে চৌদ্দ সেকেন্ডের জন্য। এটি অর্থবোধ করে কারণ প্রথম অ-আর-স্ক্রিন বার্তাটি "এন সম্পূর্ণ হয়েছে" যা কিছু প্রক্রিয়াজাত হওয়ার পরে কেবল কাজ করবে। যদি এটি ভুল হয়, দয়া করে আমাকে সংশোধন করুন!
টেক্সাস-ব্রোনিয়াস

এছাড়াও, আমার অভিজ্ঞতা থেকে। আপনি যদি পৃষ্ঠাটি ছেড়ে দেন তবে প্রক্রিয়াধীন ব্যাচ অপারেশন / অংশটি সম্পূর্ণ না হওয়া অবধি সম্পদ গ্রহণ করবে। এটি ব্যাচের কাজ আর কোনও কাজ থেকে সরিয়ে দেয় না তবে এটি বর্তমানটি সম্পূর্ণ করে।
এলিজা লিন

10

ব্যাচের অনুরোধ সহ পৃষ্ঠাটি বন্ধ থাকলে কি ব্যাচ প্রক্রিয়াজাতকরণ বন্ধ হবে?

হ্যাঁ, এটি বন্ধ হয়ে যাবে।

একই ইউআরএলটি আবার খোলার পরে কি এটি পুনরায় চালু হবে? স্থানান্তর মডিউলটি মাঝে মাঝে চলতে থাকে তবে এটি সম্ভবত সারি ব্যবহার করে?

দীনেশ যেমন বলেছিলেন এটি বাস্তবায়নের উপর নির্ভর করে।

আপনার ড্র্যাশ ব্যবহার করে মাইগ্রেশন চালানো উচিত, কারণ

ড্রাশ কমান্ড লাইনে চলে এবং যে কোনও সময় সীমা সাপেক্ষে না (বিশেষত, পিএইচপি-র সর্বোচ্চ_অজাগরণ_কাল প্রযোজ্য নয়)। সুতরাং, আপনি যখন কোনও মাইগ্রেশন প্রক্রিয়াটি ড্রাশের মাধ্যমে চলমান শুরু করেন তখন এটি শুরু হয় এবং এটি শেষ না হওয়া পর্যন্ত চলতে থাকে।

ওয়েব ইন্টারফেসের মাধ্যমে প্রক্রিয়াগুলি চলাকালীন, পিএইচপি সর্বোচ্চ_অ্যাক্সিউশন_টাইম (সাধারণত 30 সেকেন্ড কম না হলে) প্রযোজ্য। সুতরাং, দীর্ঘ-চলমান প্রক্রিয়াগুলির জন্য আমাদের ব্যাচ এপিআই ব্যবহার করা উচিত, যা একাধিক অনুরোধ জুড়ে একটি প্রক্রিয়া ভাঙ্গতে পরিচালিত করে। সুতরাং, একটি মাইগ্রেশন প্রক্রিয়া শুরু হবে, 25 সেকেন্ড বা তার জন্য চালানো হবে, তারপরে থামুন এবং ব্যাচ এপিআই একটি নতুন পৃষ্ঠার অনুরোধ জানাবে, যাতে মাইগ্রেশন প্রক্রিয়া পুনরায় শুরু হবে, বিজ্ঞাপন হিসাবে।

সুতরাং, এটি বোঝার জন্য, কেন ড্রাশ ভাল?

এটি দ্রুত

ব্যাচ এপিআই প্রচুর ওভারহেড পরিচয় করিয়ে দেয় - পৃষ্ঠার অনুরোধগুলি বন্ধ করে এবং পুনরায় প্রত্যাহার করে, মাইগ্রেশন প্রক্রিয়াটি আবার প্রয়োজনীয় সমস্ত কনস্ট্রাক্টরের মাধ্যমে চালানো প্রয়োজন, ডাটাবেস সংযোগগুলি পুনঃপ্রকাশিত এবং কোয়েরি পুনরায় চালু করা হয় এবং আংশিক আমদানির জন্য, এটি বেছে নেওয়া প্রয়োজন এটি যেখানে ছেড়ে গিয়েছিল সেখানে - যদি প্রথম 500 উত্স রেকর্ড আমদানি করা হয়, তবে এটি 501 তম রেকর্ডটি সন্ধান করতে হবে। আপনার উত্স ফর্ম্যাট এবং কীভাবে এটি নির্মিত হয়েছে তার উপর নির্ভর করে এটি স্কেল হতে পারে বা না - আপনি যদি কোনও এসকিউএল উত্সের সাহায্যে উচ্চ জল চিহ্ন ব্যবহার করেন তবে ক্যোয়ারী নিজেই পূর্ববর্তী রেকর্ডগুলি মুছে ফেলতে পারে এবং আপনি যেখানে রেখেছিলেন ঠিক সেখানেই শুরু করতে পারে। যদি তা না হয় তবে মাইগ্রেটকে প্রথম অ-আমদানিকৃত রেকর্ডের সন্ধানের উত্স ডেটা দিয়ে স্ক্রোল করা দরকার। আপনার উত্স হিসাবে একটি বড় এক্সএমএল ফাইল সহ, বলুন,

এটি আরও নির্ভরযোগ্য

আপনার ব্রাউজারের মাধ্যমে মাইগ্রেশন চালানো ব্যর্থতার পয়েন্ট হিসাবে আপনার ডেস্কটপ এবং আপনার স্থানীয় ইন্টারনেট সংযোগ যুক্ত করে। যখন ব্যাচ এপিআই পরবর্তী পৃষ্ঠার অনুরোধে চলেছে তখন একটি নেটওয়ার্ক গণ্ডব, একটি ব্রাউজার ক্র্যাশ, ভুল ট্যাব বা উইন্ডোর একটি দুর্ঘটনাজনিত বন্ধ আপনার সমস্ত স্থানান্তরকে বাধা দিতে পারে। ড্রাশে চালনা চলমান অংশগুলি হ্রাস করে - আপনি আপনার ডেস্কটপ এবং স্থানীয় ইন্টারনেট সংযোগকে কারণ হিসাবে মুছে ফেলেন।

এটি আরও সহায়ক

ড্রাশে চলার সময় যদি কিছু ভুল হয়ে যায়, যদি কোনও কার্যকর ত্রুটির বার্তা থাকে তবে আপনি সেগুলি দেখতে পাবেন। ব্যাচ এপিআই ব্যবহার করে ব্যর্থতা প্রায়শই গ্রাস হয়ে যায় এবং আপনি যা দেখতে পান তা হ'ল সম্পূর্ণ অকেজো "একটি এজেএক্স HTTP অনুরোধ অস্বাভাবিকভাবে বন্ধ হয়ে গেছে ated তথ্য ডিবাগিংয়ের পরে অনুসরণ করা হচ্ছে।

আপনি এখানে আরও তথ্য পেতে পারেন ।

এর মধ্যে আপনি ব্রাউজার উইন্ডোটি বন্ধ থাকলেও ব্যাচটি চালাতে চান, ব্যাকগ্রাউন্ড প্রক্রিয়া মডিউলটি বিবেচনা করুন । এটিতে একটি সাবমডিউল ব্যাকগ্রাউন্ড ব্যাচ রয়েছে যা চালাকি করে।

এই মডিউলগুলি বিদ্যমান ব্যাচ এপিআই গ্রহণ করে এবং একটি পটভূমি প্রক্রিয়াতে ব্যাচ কাজ চালায়। এর অর্থ হ'ল আপনি যদি ব্যাচ পৃষ্ঠাটি ছেড়ে দেন তবে চাকরিগুলি অব্যাহত থাকে এবং আপনি পরে অগ্রগতি সূচকে ফিরে আসতে পারেন।


বাহ, স্থানান্তরিত করতে ড্রাশ ব্যবহার করে একটি বিশাল উন্নতি হয়েছে। আমাকে একটি লাইভ সাইটে মাইগ্রেট করতে হবে এবং এটি সিস্টেমে খুব কম লোড রাখে! ধন্যবাদ!
uwe

0

ব্যাচ এপিআই সাবধানতার সাথে বুঝতে এবং এই মডিউলগুলি আপনাকে সহায়তা করবে:

1- প্রজারা এটি যে কোনও অগ্রগতির উপর নজর রাখার জন্য জেনেরিক কাঠামো বাস্তবায়নের একটি প্রয়াস

2- পটভূমি অগ্রগতি বিদ্যমান ব্যাচ এপিআই গ্রহণ করে এবং একটি পটভূমি প্রক্রিয়াতে ব্যাচ কাজ চালায়

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.