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]
źródło
Odpowiedzi:
To działało dla mnie:
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.
źródło
@sites
polecenia. 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ę listyW przypadku pojedynczego wystąpienia (bez listy witryn):
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.Następnie nazywany:
Następnie zadzwoni:
źródło