Я использую мульти-сайты 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]
источник
Ответы:
Это сработало для меня:
Я не уверен, насколько это было одновременно; последнее сообщение о site1 пришло сразу после первого сообщения для site2, а все остальные сообщения были напечатаны последовательно. Я не измерял, в какой степени каждая операция cc выполнялась одновременно, или в какой степени система могла быть только что связана с процессором или вводом-выводом, но, похоже, она работала номинально.
источник
@sites
команды. Тем не менее, один недостаток заключается в том, что если каталог сайта является символической ссылкой, команда не распознает его. в моем случае символическая ссылка на dir вне корня drupal, поэтому ls-l дает:site_dir -> ../../sites/site/src
.. возможно, это ошибка, которую я могу исправить, если вы можете указать мне код, ответственный за создание спискаДля одного экземпляра (без списка сайтов):
Для псевдонимов с массивом site-list он будет работать одновременно ...
После комментариев ниже давайте рассмотрим код для drush_invoke_process:
//
- мой комментарий,/* ... */
- сокращение предоставленного кода.Далее называется:
Далее будет названо:
источник