Jak korzystać z możliwości jednoczesnego wykonywania Drusha?

9

Używam wielu witryn Drupal (pojedyncza baza kodów, wiele witryn / *). Wraz z tym zacząłem używać aliasów Drusha do zarządzania nimi:

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

To pozwala mi łatwo wykonywać działania na wszystkich stronach:

$ drush @localdev cc all

>> Właśnie odkryłem, że mogę po prostu używać @sites i zrezygnować z pliku drushrc .

Wykonanie tego spowoduje wykonanie polecenia „cc all” na każdej z moich witryn w serii (pojedynczo).

Chciałbym wziąć to do następnego poziomu i spróbuj uruchomić te polecenia na wszystkich stronach simulantiously . Robiłem kilka czytania i jestem pod wrażeniem, że Drush ma rzeczywiście wspierać. Funkcja drush_invoke_process () pobiera $ backend_options, które mogą zawierać (z dokumentacji funkcji):

 *      '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'.

Nie potrafię jednak rozgryźć , w jaki sposób faktycznie używam tego z wiersza poleceń Drush . Czy jest jakaś opcja, którą muszę przekazać Drushowi, czy też muszę ustawić coś w pliku ustawień?

Wszelkie informacje będą mile widziane - moja ciekawość jest rozbudzona!

AKTUALIZACJA

Na podstawie poniższych odpowiedzi udało mi się stworzyć prosty test, który demonstruje zachowanie Drusha i wyciągnąć kilka wniosków:

Domyślnym zachowaniem Drusha podczas wykonywania operacji na wielu witrynach jest używanie współbieżnych procesów:

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

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

Dzieje się tak nawet wtedy, gdy nie używasz aliasów, i dotyczy to także korzystania z wbudowanego aliasu @ Witryny Drusha. Te dwa polecenia dają identyczne zachowanie jak powyżej:

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

Aby zmienić liczbę współbieżnych procesów (domyślnie jest to 4), opcję „--concurrency = N” można przekazać w poleceniu drush. Na przykład, jeśli chcę wykonać szeregowo, mogę ustawić liczbę równoczesnych procesów na 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
źródło
To bardzo dobre podsumowanie; dzięki za napisanie tego. Byłoby wspaniale, gdyby te informacje były gdzieś w dokumentacji Drusha. Otworzyłem problem, aby uchwycić: drupal.org/node/1914224
greg_1_anderson

Odpowiedzi:

5

To działało dla mnie:

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

Nie jestem pewien, jak to było współbieżne; ostatnia wiadomość o stronie 1 pojawiła się natychmiast po pierwszej wiadomości dla strony 2, a wszystkie pozostałe wiadomości zostały wydrukowane sekwencyjnie. Nie mierzyłem, w jakim stopniu każda operacja CC odbywała się jednocześnie, ani w jakim stopniu system mógł być właśnie związany z procesorem lub we / wy, ale wydawało się, że nominalnie działa.

greg_1_anderson
źródło
Pracuję z czymś podobnym do tego i zdałem sobie sprawę z przydatnego sposobu robienia rzeczy za pomocą @sitespolecenia. Jednak jedną wadą jest to, że jeśli katalog witryny jest dowiązaniem symbolicznym, polecenie go nie rozpoznaje. w moim przypadku dowiązanie symboliczne prowadzi do katalogu poza rootem drupala, więc ls- l: site_dir -> ../../sites/site/src… może to jest błąd, który mogę naprawić, jeśli możesz wskazać mi kod odpowiedzialny za budowę listy
awm
1

W przypadku pojedynczego wystąpienia (bez listy witryn):

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

W przypadku aliasów z tablicą listy witryn będzie działał jednocześnie nawet ...

Po poniższych komentarzach przejrzyjmy kod dla drush_invoke_process:
//- mój komentarz, /* ... */- skrócenie dostarczonego kodu.

<?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);
}
?>

Następnie nazywany:

<?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);
}
?>

Następnie zadzwoni:

<?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;
}
?>
Nikit
źródło
Czy możesz wyjaśnić? Czy mówisz, że korzystając z listy witryn, Drush automatycznie wykona polecenia na wszystkich stronach? Jestem zdezorientowany, ponieważ opiekun Drush zasugerował, że domyślnym zachowaniem jest szeregowe wykonywanie drupal.org/node/628996#comment-2637008 .
rcourtna
invoke-multiple służy do wielokrotnego uruchamiania tego samego polecenia w tej samej witrynie z tymi samymi opcjami i argumentami. Chcesz --concurrency = N do uruchamiania tego samego polecenia w wielu witrynach. W każdym razie taka jest intencja; Nie testowałem z @sites ani „listą witryn”, ale zbłądzasz poza zamierzonym zachowaniem, gdyby tak się stało.
greg_1_anderson
Masz rację co do --concurrency; jeśli uruchomisz polecenie na wielu witrynach w trybie debugowania bez opcji --concurrency i bez opcji --invoke-multiple, możesz łatwo zobaczyć, że wszystkie polecenia są uruchamiane jednocześnie. Ale ponownie „invoke-multiple” => PRAWDA nic nie robi, a ustawienie jej na 2 w aliasie strony spowodowałoby, że wszystkie polecenia byłyby uruchamiane dwukrotnie.
greg_1_anderson
2greg_1_anderson: ustawienie invoke_multiple zadziała, jeśli nie ustawisz aliasu lub listy witryn ...
Nikit