Как использовать возможность одновременного выполнения Drush?

9

Я использую мульти-сайты Drupal (одна кодовая база, несколько сайтов / *). Наряду с этим я начал использовать псевдонимы Drush для управления ими:

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

Это позволяет мне легко выполнять действия на всех сайтах:

$ drush @localdev cc all

>> Я также только что обнаружил, что могу просто использовать @sites и отказаться от файла drushrc .

При этом будет выполнено «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'.

Однако я не могу понять, как на самом деле использовать это из командной строки Drush . Есть ли вариант, который мне нужно передать в Drush, или мне нужно что-то установить в файле настроек?

Любая информация будет высоко оценена - мое любопытство задето!

ОБНОВИТЬ

Основываясь на ответах ниже, я смог создать простой тест, который демонстрирует поведение Drush, и сделать некоторые выводы:

Поведение Drush по умолчанию при выполнении операций на нескольких сайтах заключается в использовании параллельных процессов:

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

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

Это верно даже при отсутствии псевдонимов, а также при использовании псевдонима Drush @sites. Эти две команды дают идентичное поведение, как указано выше:

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

Чтобы изменить количество одновременных процессов (по умолчанию 4), в команде drush может быть передана опция --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]
rcourtna
источник
Это очень хорошее резюме; спасибо, что написали это. Было бы здорово, если бы эта информация была где-то в документации по Drush. Я открыл вопрос, чтобы захватить это: drupal.org/node/1914224
greg_1_anderson

Ответы:

5

Это сработало для меня:

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

Я не уверен, насколько это было одновременно; последнее сообщение о site1 пришло сразу после первого сообщения для site2, а все остальные сообщения были напечатаны последовательно. Я не измерял, в какой степени каждая операция cc выполнялась одновременно, или в какой степени система могла быть только что связана с процессором или вводом-выводом, но, похоже, она работала номинально.

greg_1_anderson
источник
Я работаю с чем-то похожим на это и понял удобный способ сделать что-то с помощью @sitesкоманды. Тем не менее, один недостаток заключается в том, что если каталог сайта является символической ссылкой, команда не распознает его. в моем случае символическая ссылка на dir вне корня drupal, поэтому ls-l дает: site_dir -> ../../sites/site/src.. возможно, это ошибка, которую я могу исправить, если вы можете указать мне код, ответственный за создание списка
awm
1

Для одного экземпляра (без списка сайтов):

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

Для псевдонимов с массивом site-list он будет работать одновременно ...

После комментариев ниже давайте рассмотрим код для 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 будет автоматически выполнять команды одновременно на всех сайтах? Я запутался, потому что сопровождающий Drush предположил, что по умолчанию используется последовательное выполнение drupal.org/node/628996#comment-2637008 .
rcourtna
invoke-multiple предназначен для запуска одной и той же команды на одном сайте с одними и теми же параметрами и аргументами несколько раз. Вы хотите --concurrency = N для запуска одной и той же команды на нескольких сайтах. В любом случае это намерение; Я не тестировал ни @sites, ни «site-list», но вы выходите за пределы предполагаемого поведения, если это сработает.
greg_1_anderson
Вы правы относительно --concurrency; если вы запускаете команду на нескольких сайтах в режиме отладки без --concurrency и без --invoke-multiple, вы можете легко увидеть, что она выполняет все команды одновременно. Но опять же, 'invoke-multiple' => TRUE ничего не делает, и установка его в 2 в псевдониме сайта заставит все ваши команды выполняться дважды.
greg_1_anderson
2greg_1_anderson: настройка invoke_multiple будет работать, если вы не 'установите псевдоним или список сайтов ...
Никит,