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


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.