একটি কিউ প্রক্রিয়াকরণের জন্য আমার কি ক্রোন টাস্ক দরকার?


32

আমার একটি কাজ হয়েছে যা প্রায় 45 মিনিট সময় নেয় এবং প্রতিদিন ঘটতে হবে (বেশ কয়েকটি বহিরাগত ডাটাবেসগুলিতে ব্যবহারকারীদের সমন্বয় করা ইত্যাদি)।

কাজটি পরিচালনা করতে, আমি নীচে ক্রোন সারি সেট করেছি hook_cron_queue_info():

function mymodule_cron_queue_info() {
  $queues = array();
  $queues['update_users_queue'] = array(
    'worker callback' => '_mymodule_process_user_queue_item',
    'time' => 120,
  );
  return $queues;
}

আমি এই ফাংশনটি ব্যবহার করে সারিটি পূরণ করি:

function mymodule_queue_all_users_for_synching() {
  //...query for users...

  $queue = DrupalQueue::get('update_users_queue');
  foreach($users as $user) {
    $queue->createItem($user);
  }
}

ক্রো-ফিলিং ফাংশনটি ক্রোন টাস্ক হিসাবে ডেকে আনে। আমি এলিসিয়া ক্রোন ব্যবহার করি , তাই আমার প্রয়োগটি hook_cronapi()হ'ল:

function mymodule_cronapi($op, $job = NULL) {
  $items = array();
  $items['queue_users_for_synch'] = array(
    'description' => 'Queue all user accounts for synching.',
    'rule' => '0 3 * * *', // Run this job every day at 3am.
    'callback' => 'mymodule_queue_all_users_for_synching',
  );
  return $items;
}

প্রতিটি কাতুর আইটেমের জন্য কর্মী ফাংশন, এতে সংজ্ঞায়িত হয় mymodule_cron_queue_info:

function _mymodule_process_user_queue_item($item) {
  //...synchronize user ($item)...
}

আমার প্রশ্ন হ'ল ক্রোন কখন কাতারে প্রক্রিয়া শুরু করবে?

বলুন আমি প্রতিদিন ভোর 3 টায় কিউ পূরণ করি, এবং এটি শেষ না হওয়া পর্যন্ত প্রতি 30 মিনিটের মধ্যে 120 সেকেন্ডে প্রক্রিয়া করতে চাই - আমাকে কি আর একটি ক্রোন টাস্ক তৈরি করার দরকার আছে?


আমার উল্লেখ করা উচিত আমি ড্রুপাল using ব্যবহার করছি
জো_ফ্ল্যাশ

1
আমি এই প্রশ্ন সম্পর্কে পাশাপাশি কৌতূহলী। হ্যাঁ বা না শুনতে চাই। আমরা আমাদের ডি 7 প্রকল্পগুলির মধ্যে ভারীভাবে কাতারের API ব্যবহার করি। দৃশ্যত আমি দেখেছি ron সারি} টেবিলের সারিগুলি ক্রোন চলাকালীন সাফ হয়ে গেছে। সুতরাং এটি হ্যাঁ অনুমান।
শিবাজি

উত্তর:


19

যখন দ্রুপাল ক্রোন টাস্কগুলি চালায়, এটি স্বয়ংক্রিয়ভাবে মডিউলগুলি থেকে নির্ধারিত কোনও ক্রোন সারি হ্যান্ডেল করে drupal_cron_run(); প্রথমে hook_cron()প্রয়োগগুলি শুরু করা হয় এবং তারপরে ক্রোন সারিগুলি খালি করা হয়।

অন্তর্নিহিত hook_cronapi(), আপনি আপনার মডিউলটির ক্রোন সারি পরিচালনা করে অন্য কোনও ফাংশনের জন্য একটি এন্ট্রি যুক্ত করতে পারেন।

function mymodule_cronapi($op, $job = NULL) {
  $items = array();

  $items['queue_users_for_synch'] = array(
    'description' => 'Queue all user accounts for synching.',
    'rule' => '0 3 * * *', // Run this job every day at 3am.
    'callback' => 'mymodule_queue_all_users_for_synching',
  );

  $items['clean_queue'] = array(
    'description' => 'Clean the queue for the user synching.',
    'rule' => '0 4 * * *', // Run this job every day at 4 AM.
    'callback' => 'mymodule_clean_queue',
  );

  return $items;
}

function mymodule_clean_queue() {
  $queues = module_invoke('mymodule', 'cron_queue_info');
  drupal_alter('cron_queue_info', $queues);

  // Make sure every queue exists. There is no harm in trying to recreate an
  // existing queue.
  foreach ($queues as $queue_name => $info) {
    DrupalQueue::get($queue_name)->createQueue();
  }

  foreach ($queues as $queue_name => $info) {
    $function = $info['worker callback'];
    $end = time() + (isset($info['time']) ? $info['time'] : 15);
    $queue = DrupalQueue::get($queue_name);
    while (time() < $end && ($item = $queue->claimItem())) {
      $function($item->data);
      $queue->deleteItem($item);
    }
  }
}

বিকল্পটি হ'ল ড্রুপাল আপনার জন্য ক্রোন সারিটি পরিচালনা করতে দিচ্ছে, তবে ড্রুপাল ক্রোন কার্য সম্পাদন করার পরে তা ঘটে। আপনি যদি আপনার মডিউলের ক্রোন সারিটি আরও ঘন ঘন খালি করতে চান তবে আপনি কেবলমাত্র এলিসিয়া ক্রোন মডিউল দ্বারা পরিচালিত একটি নতুন ক্রোন টাস্ক যুক্ত করতে পারেন।

এলিসিয়া ক্রোন মডিউলটি ক্রোন সারিগুলি পরিচালনা করে elysia_cron_run(); এই ফাংশন থেকে প্রার্থনা করা হচ্ছে elysia_cron_cron()(এর একটি বাস্তবায়ন hook_cron()), drush_elysia_cron_run_wrapper()নিজস্ব থেকে (ক Drush কমান্ড কলব্যাক), এবং cron.php । যদি আপনি INSTALL.txt ফাইলের নির্দেশাবলী অনুসরণ করেন (বিশেষত "পদক্ষেপ বি: পরিবর্তিত সিস্টেম ক্রোনট্যাব (বিকল্প)") এবং HTTP: // উদাহরণের সাথে http://example.com/cron.php এর যে কোনও অনুরোধকে প্রতিস্থাপন করেছেন .কম / সাইটস / সমস্ত / মডিউল / ইলিশিয়া ক্রোন / ক্রোন.এফপি , ইলিশিয়া ক্রোন মডিউলটি ইতিমধ্যে ক্রোন সারিগুলি পরিচালনা করা উচিত। আমি প্রস্তাবিত কোডটি আপনার মডিউল থেকে ব্যবহৃত ক্রোন সারিগুলি পরিচালনা করার গতি বাড়ানোর জন্য ব্যবহার করা যেতে পারে, যদি কার্যকরভাবে এটি করার প্রয়োজন হয় তবে।

// This code is part of the code executed from modules/elysia_cron/cron.php.
define('DRUPAL_ROOT', getcwd());

include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_override_server_variables(array(
  'SCRIPT_NAME' => '/cron.php',
));
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

if (!isset($_GET['cron_key']) || variable_get('cron_key', 'drupal') != $_GET['cron_key']) {
  watchdog('cron', 'Cron could not run because an invalid key was used.', array(), WATCHDOG_NOTICE);
  drupal_access_denied();
}
elseif (variable_get('maintenance_mode', 0)) {
  watchdog('cron', 'Cron could not run because the site is in maintenance mode.', array(), WATCHDOG_NOTICE);
  drupal_access_denied();
}
else {
  if (function_exists('elysia_cron_run')) {
    elysia_cron_run();
  }
  else {
    drupal_cron_run();
  }
}

আহ, ধন্যবাদ @ কিয়াম! এটাই আমার সন্দেহ, তবে আমি আমার মস্তিষ্ককে প্রায় পুরোটা জড়িয়ে রাখতে পারিনি।
জো_ফ্ল্যাশ

আসলে, আমি মনে করি আমি এখানে কিছু মিস করছি। আপনি বলেছিলেন বিকল্পটি আমার জন্য ক্রুপ সারিটি ড্রপলকে পরিচালনা করতে দিচ্ছে; আমার অনুমান আমার মূল প্রশ্নের একটি অংশটি আসলে কখন ঘটে ? প্রতিবার ক্রন্টব অনুরোধ cron.php? যদি এটি হয় তবে প্রতি মিনিটে এটি ঘটে (@ ডেভিডের জবাব সম্পর্কে আমার প্রথম মন্তব্য দেখুন)।
জো_ফ্লেশ

1
এটি উল্লেখ করার মতো এটি দেখা যাচ্ছে যে এলিসিয়ার ক্রোনটির নিজস্ব ক্রোন_উইউ প্রসেসরের বাস্তবায়ন রয়েছে elysia_cron_runক্রোন সারিগুলির সাথে স্বয়ংক্রিয়ভাবে প্রসেস হওয়া প্রতিটি সময়ই ইলিশিয়ার ক্রোন.এফপি অনুরোধ করা হয়।
ডেভিড থমাস

@ জো_ফ্ল্যাশ আমি দুঃখিত: আমার আরও পরিষ্কার হওয়া উচিত ছিল। হ্যাঁ, ক্রোন.এইচপিপি চালু করা হলে (দ্রুপাল runs পর্যন্ত প্রতিটি দ্রুপাল সংস্করণের জন্য) দ্রুপাল ক্রোন টাস্কগুলি চালায়। ড্রুপাল 8-এ, ক্রোন.এফপি আর উপস্থিত নেই এবং ক্রোন কার্যগুলি ভিন্ন সিস্টেমের পাথ ব্যবহার করে সম্পাদন করা হয়।
কিমলালুনো

2

সারিটি নির্ধারিত সময়ে এলিসিয়া ক্রোনাপি হুকের মাধ্যমে পপুলেশন করা হবে।

যাইহোক, যখনই স্ট্যান্ডার্ড দ্রুপাল ক্রোন রান ঘটে তখন সারিটি প্রক্রিয়া করা হবে।

মূলটির শেষে এই কর্মী কলব্যাক প্রসেসিং স্নিপেটটি দেখুন: drupal_cron_run

 foreach ($queues as $queue_name => $info) {
    $function = $info['worker callback'];
    $end = time() + (isset($info['time']) ? $info['time'] : 15);
    $queue = DrupalQueue::get($queue_name);
    while (time() < $end && ($item = $queue->claimItem())) {
      $function($item->data);
      $queue->deleteItem($item);
    }
  }

ডেভিড, সম্ভবত এলিসিয়া এখানে কিছুটা জটিলতার পরিচয় দিয়েছে? আমি প্রতি মিনিটেই ইলিসিয়া cron.phpস্ক্রিপ্টটি ট্রিগার করার জন্য ক্রোনটব সেট করে রেখেছি , যা ইলিসিয়াকে মিনিট অনুসারে রেজ্যুলেশনের মাধ্যমে টাস্ক সময় নিয়ন্ত্রণ করতে দেয়। আসলে প্রতি মিনিটে কোনও টাস্ক চলতে পারে না - যা কি কারণে আমাকে বিশেষভাবে কাতারে কাজ করার জন্য একটি টাস্ক তৈরি করার দরকার মনে করেছিল?
জো_ফ্লেশ

@ জো_ফ্ল্যাশ যতক্ষণ কল করা drupal_cron_runহচ্ছে ততক্ষণ আপনার ক্রোন কিউ কর্মী কলব্যাক প্রক্রিয়া করা হবে।
ডেভিড থমাস

আহ, আমি ঠিক বলেছি তবে, drupal_cron_runএলিসিয়া cron.phpস্ক্রিপ্ট থেকে কল পাবেন না (যখন এলিসিয়া সক্ষম করা থাকে); elysia_cron_runপরিবর্তে ব্যবহৃত হয়।
জো_ফ্ল্যাশ 6:25

hook_cron_queue_infoসেক্ষেত্রে দেখে মনে হচ্ছে আপনি drupal_cron_runউপরের কোর ফাংশন স্নিপেট অনুযায়ী নিজের কর্মী কলব্যাক নির্দিষ্ট না করে আপনি এলিসিয়া ক্রোন ব্যবহার করতে পারবেন না ।
ডেভিড থমাস

elysia_cron_runকল না drupal_cron_run, কিন্তু এটা না কল module_invoke_all('cron_queue_info')মাল্টি চ্যানেল পরিচালনার করে নির্মিত হয় আমার কানে আসা আউট ধূমপান এবং না কিছু অভিনব-প্যান্ট।
জো_ফ্ল্যাশ

1

উপরে উল্লিখিত হিসাবে এলিজিয়া ক্রোন ব্যবহার করার সময় আপনার সারিগুলি প্রক্রিয়াজাত হয় না।

আপনার (এবং দ্রুপাল) কাতারে কোনও অ্যাক্সেস নেই যা অন্যথায় drupal_run_cron এ চলে

কাজটি হ'ল একটি কাস্টম ক্রোন টাস্ক তৈরি করা - (এটি ইলিশিয়া ক্রোন দ্বারা দৃশ্যমান হবে) হয় সমস্ত কাতারে বা যেটি আপনি চান সেটিকে প্রক্রিয়া করতে এবং সেখানে সারি প্রক্রিয়াকরণ শুরু করতে। অর্থাৎ,

function mymodule_cron() {
// below is copied from drupal_cron_run() in common.inc

// Grab the defined cron queues.
$queues = module_invoke_all('cron_queue_info');
drupal_alter('cron_queue_info', $queues);

//if you want to target only one queue you can remove 'foreach'
and your $info = $queues['your_queue'];

  foreach ($queues as $queue_name => $info) {
    if (!empty($info['skip on cron'])) {
      // Do not run if queue wants to skip.
      continue;
    }
    $callback = $info['worker callback'];
    $end = time() + (isset($info['time']) ? $info['time'] : 15);
    $queue = DrupalQueue::get($queue_name);
     while (time() < $end && ($item = $queue->claimItem())) {
      try {
        call_user_func($callback, $item->data);
        $queue->deleteItem($item);
      }
      catch (Exception $e) {
        // In case of exception log it and leave the item in the queue
        // to be processed again later.
        watchdog_exception('cron', $e);
      }
    }
  }
}

এখন সারি প্রক্রিয়াকরণ ElysiaCron দ্বারা নিয়ন্ত্রিত হতে পারে


0

আমি এলিসিয়া ব্যবহার করি না, তবে আমার সমাধানটি সর্বদা এরকম কিছু ছিল:

function mymodule_cron() {
  $queue = DrupalQueue::get('mymoudule_queue');
  $queue->createQueue();
  $item = $queue->claimItem(300);

  if (!empty($item->data)) {

    // Do the work.

    if ($sucess) {
      $queue->deleteItem($item);
      watchdog('mymodule', 'It worked.');
    }
    else {
      watchdog('mymodule', 'It did not work!', array(), WATCHDOG_ALERT);
    }
  }
}

প্রতিটি ক্রোন রান করার জন্য এটি কেবল একটি আইটেম পরিচালনা করে। আপনি এটি পরিবর্তন করতে চান।


0

আমি ইলিসিয়া ক্রোন সহ প্রথমবারের মতো কুই এপিআই ব্যবহার করছি বলে আমিও এইদিকে মাথা ঘোরানোর চেষ্টা করেছি। কাছাকাছি পরিদর্শন করার পরে আপনি দেখতে পাবেন যে এলিয়াসিয়া ক্রন ক্রিয়াকলাপ আইটেমগুলি কার্যকর করে যখন এলিয়াসিয়া_ক্রোন_আরুন বলা হয়। Elysia_cron.module ফাইলের মধ্যে 1044 লাইন থেকে এই স্নিপেটটি দেখুন :

if (EC_DRUPAL_VERSION >= 7) {
  // D7 Queue processing
  foreach ($queues as $queue_name => $info) {
    $function = $info['worker callback'];
    $end = time() + (isset($info['time']) ? $info['time'] : 15);
    $queue = DrupalQueue::get($queue_name);
    while (time() < $end && ($item = $queue->claimItem())) {
      $function($item->data);
      $queue->deleteItem($item);
    }
  }
}

ইলিসিয়া ক্রোন ব্যবহার করার সময় এটি আমার জন্য কাতারের প্রক্রিয়াকরণকে নির্মূল করতে সহায়তা করে।

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