কীভাবে ড্রুশের সমকালীন কার্যনির্বাহী ক্ষমতা ব্যবহার করবেন?


9

আমি ড্রুপাল মাল্টি-সাইটগুলি (একক কোডবাস, একাধিক সাইট / *) ব্যবহার করছি। এর পাশাপাশি, আমি তাদের পরিচালনার জন্য দ্রাশ আলিয়াস ব্যবহার শুরু করেছি:

$ cat sites/all/drush/aliases.drushrc.php
<?php
$aliases['localdev'] = array(
  'site-list' => array(
    'site1', 
    'site2',
    'site3',
  ),
);
?>

এটি আমাকে সহজেই সমস্ত সাইটে ক্রিয়া সম্পাদন করতে দেয়:

$ drush @localdev cc all

>> আমি সবেমাত্র আবিষ্কার করেছি যে আমি কেবলমাত্র @ সাইটগুলি ব্যবহার করতে পারি এবং ড্রশার্ক ফাইলটি রেখে যেতে পারি ।

এটি করার ফলে, সিরিজের প্রতিটি সাইটগুলিতে (একবারে একটি করে) চালিত হবে "সিসি অল"।

আমি পরবর্তী স্তরে এই গ্রহণ করা এবং সমস্ত সাইটকে এই কমান্ড চালানোর জন্য চেষ্টা করতে চান simulantiously । আমি ছাপ অধীন কিছু পড়া, এবং টা কাজ করা হয়েছে করেছি যে Drush নেই প্রকৃতপক্ষে এই সমর্থন করি। Drush_invoke_process () ফাংশন $ backend_options, যা (ফাংশন ডকুমেন্টেশন থেকে) ধারণ করতে পারে লাগে:

 *      'invoke-multiple'
 *        If $site_alias_record represents a single site, then 'invoke-multiple'
 *        will cause the _same_ command with the _same_ arguments and options
 *        to be invoked concurrently (e.g. for running concurrent batch processes).
 *      'concurrency'
 *        Limits the number of concurrent processes that will run at the same time.
 *        Defaults to '4'.

যাইহোক, আমি যা বুঝতে পারি না তা হ'ল আমি কীভাবে ড্রশ কমান্ড লাইন থেকে এটি ব্যবহার করব । ড্রাশের কাছে যাওয়ার জন্য আমার কি কোনও বিকল্প আছে বা আমার একটি সেটিংস ফাইলে কিছু সেট করার দরকার আছে?

যে কোনও তথ্য অনেক প্রশংসা করা হবে - আমার কৌতূহল piqued হয়!

হালনাগাদ

নীচের উত্তরের উপর ভিত্তি করে, আমি একটি সাধারণ পরীক্ষা তৈরি করতে সক্ষম হয়েছিল যা দ্রাশের আচরণ প্রদর্শন করে এবং কিছু উপসংহার আঁকা:

একাধিক সাইটে ক্রিয়াকলাপ চালানোর সময় ড্রশের ডিফল্ট আচরণটি সহবর্তী প্রক্রিয়াগুলি ব্যবহার করা হয়:

$ drush @localdev ev "drupal_set_message(time()); sleep(5);"

Continue?  (y/n): y
site1             >> 1360512943      [status]
site2             >> 1360512943      [status]
site3             >> 1360512943      [status]

উপকরণ ব্যবহার না করার পরেও এটি সত্য এবং ড্রশ-এর অন্তর্নির্মিত @ সাইটগুলি ব্যবহার করেও এটি সত্য। এই দুটি কমান্ড উপরের মতো একই আচরণ করে:

$ drush site1,site2,site3 ev "drupal_set_message(time()); sleep(5);"
$ drush @sites ev "drupal_set_message(time()); sleep(5);"

সমবর্তী প্রসেসের সংখ্যা পরিবর্তন করতে (ডিফল্ট হ'ল 4), '--concurrency = N' বিকল্পটি ড্রশ কমান্ডে পাস করা যেতে পারে। উদাহরণস্বরূপ, আমি যদি সিরিয়াল এক্সিকিউশন চাই, আমি সমবর্তী প্রক্রিয়াগুলির সংখ্যা 1 এ সেট করতে পারি:

$ drush @localdev ev "drupal_set_message(time()); sleep(5);" --concurrency=1

Continue?  (y/n): y
site1             >> 1360513387      [status]
site2             >> 1360513393      [status]
site3             >> 1360513399      [status]

এটি খুব ভাল সংক্ষিপ্তসার; এটি লেখার জন্য ধন্যবাদ তথ্যটি কোথাও ড্রশ ডকুমেন্টেশনে থাকলে এটি দুর্দান্ত হবে। আমি ক্যাপচার করার একটি বিষয় খোলা যে: drupal.org/node/1914224
— greg_1_anderson

উত্তর:


5

এটি আমার পক্ষে কাজ করেছে:

drush @site1,@site2,@site3,@site4 cc all --concurrency=4

আমি নিশ্চিত না যে এটি আসলে কতটা সামঞ্জস্য ছিল; সাইট 1 সম্পর্কে সর্বশেষ বার্তাটি সাইট 2 এর জন্য প্রথম বার্তার পরে অবিলম্বে এসেছিল এবং অন্যান্য সমস্ত বার্তা ক্রমানুসারে মুদ্রিত হয়েছিল। প্রতিটি সিসি অপারেশন একযোগে কী পরিমাণে ঘটেছিল বা সিস্টেমটি কেবলমাত্র সিপিইউ বা i / o আবদ্ধ হতে পারে তা পরিমাপ করিনি, তবে এটি নামমাত্র কাজ করছে বলে মনে হয় না।


আমি এর অনুরূপ কিছু নিয়ে কাজ করছি এবং @sitesকমান্ডটি ব্যবহার করে জিনিসগুলি করার একটি সহজ উপায় উপলব্ধি করেছি । যাইহোক, এর সাথে একটি ত্রুটি এটি হ'ল যদি সাইট ডিরেক্টরিটি একটি সিমিলিংক হয়, কমান্ডটি এটি স্বীকৃতি দেয় না। আমার ক্ষেত্রে সিমলিংকটি ড্রুপাল মূলের বাইরে একটি ডিরের সাথে থাকে যাতে এলএসএল দেয়: site_dir -> ../../sites/site/src.. সম্ভবত এটি আপনি বাগটি ঠিক করতে পারবেন যদি আপনি আমাকে তালিকা তৈরির জন্য দায়বদ্ধ
— এএমএম

1

একক উদাহরণের জন্য (সাইট-তালিকা ছাড়াই):

<?php
$aliases['localdev'] = array(
  'invoke-multiple' => TRUE,
);
?>

সাইট-তালিকা অ্যারের সাথে উপকরণগুলির জন্য এটি একত্রে চালানো হবে ...

নীচের মন্তব্যের পরে , আসুন drush_invoke_process এর কোডটি পর্যালোচনা করুন:
//- আমার মন্তব্য, /* ... */- প্রদত্ত কোডটি ছোট করে দিন।

<?php
function drush_invoke_process($site_alias_record, $command_name, $commandline_args = array(), $commandline_options = array(), $backend_options = TRUE) {
  if (is_array($site_alias_record) && array_key_exists('site-list', $site_alias_record)) {
    /*  $invocations[] - this array filled with command for each site in site-list. */
  }
  else {
    /* aliases not defined or site-list not found.  So $invocations filled by one item. */
  }
  return drush_backend_invoke_concurrent($invocations, $commandline_options, $backend_options);
}
?>

পরবর্তী বলা:

<?php
function drush_backend_invoke_concurrent($invocations, $common_options = array(), $common_backend_options = array(), $default_command = NULL, $default_site = NULL, $context = NULL) {
  /* Here building command line happen for each site (invocation). */
  return _drush_backend_invoke($cmds, $common_backend_options, $context);
}
?>

পরবর্তী বলা হবে:

<?php
function _drush_backend_invoke($cmds, $common_backend_options = array(), $context = NULL) {
  /* Some simulating code and fork code */
  if (array_key_exists('interactive', $common_backend_options) || array_key_exists('fork', $common_backend_options)) {
    /* Direct running (interactive or fork) */
  }
  else {
    // Concurrency set to 4 by default. So --concurency just override it by another value.
    $process_limit = drush_get_option_override($common_backend_options, 'concurrency', 4);

    // Next is main call, that run commands as concurent processes using proc_open and streaming:
    $procs = _drush_backend_proc_open($cmds, $process_limit, $context);

    /* Processing of result running of processes. */

  }
  return empty($ret) ? FALSE : $ret;
}
?>

আপনি দয়া করে পরিষ্কার করতে পারেন? আপনি কি বলছেন যে কোনও সাইট-তালিকা ব্যবহার করার সময়, ড্রাশ স্বয়ংক্রিয়ভাবে সমস্ত সাইটে একই সাথে আদেশগুলি সম্পাদন করবে? আমি বিভ্রান্ত করছি কারণ একটি Drush রক্ষণাবেক্ষণকারী যে ডিফল্ট আচরণ সিরিয়াল ফাঁসি হয় drupal.org/node/628996#comment-2637008 ।
— rcourtna

ইনভোক-মাল্টিপল একাধিকবার একই বিকল্প এবং যুক্তি সহ একই সাইটে একই কমান্ড চালানোর জন্য। আপনি একাধিক সাইটে একই কমান্ড চালনার জন্য --concurrency = N চান। সেটাই উদ্দেশ্য, যাই হোক; আমি @ সাইট বা একটি 'সাইট-তালিকা' দিয়ে পরীক্ষা করিনি, তবে আপনি যদি উদ্দেশ্যযুক্ত আচরণের বাইরে বিপথগামী হন তবে কাজটি ঘটে যাওয়া উচিত।
— গ্রেগ_এন্ডারসন

আপনি --concurrency সম্পর্কে সঠিক; আপনি যদি --concurrency ছাড়াই এবং --invoke- একাধিক ছাড়াই ডিবাগ মোডে একাধিক সাইটগুলিতে কমান্ড চালনা করেন তবে আপনি সহজেই দেখতে পারেন যে এটি একই সাথে সমস্ত কমান্ড একই সাথে চলছে। তবে আবার, 'ইনভোক-মাল্টিপল' => সত্য কিছুই করে না, এবং এটির একটি সাইট ওরফে 2 এ সেট করা আপনার সমস্ত কমান্ড দুটি বার চালিত করবে।
— গ্রেগ_এন্ডারসন

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