Drush'ın eşzamanlı yürütme yeteneği nasıl kullanılır?


9

Drupal çoklu siteler kullanıyorum (tek kod tabanı, birden çok site / *). Bununla birlikte, onları yönetmek için Drush takma adlarını kullanmaya başladım:

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

Bu, tüm sitelerde kolayca işlem yapmamı sağlıyor:

$ drush @localdev cc all

>> Sadece @sites'i kullanabileceğimi ve drushrc dosyasını bırakabileceğimi de keşfettim .

Bunu yaptığınızda, sitelerimin her birinde seri olarak (birer birer) "cc all" komutu yürütülür.

Bunu bir sonraki seviyeye taşımak ve bu komutları tüm sitelerde eşzamanlı olarak çalıştırmayı denemek istiyorum . Ben Drush izlenimi altında bazı okuma ve am yaptığını mu gerçekten bunu destekliyor. Drush_invoke_process () fonksiyonu (fonksiyon belgelerinden) içerebilir $ backend_options alır:

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

Ancak anlayamadığım şey , bunu Drush komut satırından nasıl kullanacağım . Drush'a iletmem gereken bir seçenek var mı yoksa ayarlar dosyasında bir şey ayarlamam gerekiyor mu?

Herhangi bir bilgi çok takdir edilecektir - merakım pürüzlü!

GÜNCELLEME

Aşağıdaki cevaplara dayanarak, Drush'ın davranışını gösteren basit bir test yapabildim ve bazı sonuçlar çıkardım:

Birden fazla sitede işlem gerçekleştirirken Drush'ın varsayılan davranışı, eşzamanlı işlemleri kullanmaktır:

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

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

Bu, takma ad kullanmadığınızda bile geçerlidir ve Drush'ın yerleşik @ siteleri takma adı kullanılırken de geçerlidir. Bu iki komut yukarıdaki gibi aynı davranışı sağlar:

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

Eşzamanlı işlemlerin sayısını değiştirmek için (varsayılan değer 4'tür), drush komutunda '--concurrency = N' seçeneği geçirilebilir. Örneğin, seri yürütme istiyorsanız, eşzamanlı işlem sayısını 1 olarak ayarlayabilirim:

$ drush @localdev ev "drupal_set_message(time()); sleep(5);" --concurrency=1

Continue?  (y/n): y
site1             >> 1360513387      [status]
site2             >> 1360513393      [status]
site3             >> 1360513399      [status]

Bu çok iyi bir özet; yazdığınız için teşekkürler. Bu bilgi bir yerde Drush belgelerinde olsaydı harika olurdu. Bunu yakalamak için bir sorun açtım: drupal.org/node/1914224
greg_1_anderson

Yanıtlar:


5

Bu benim için çalıştı:

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

Aslında ne kadar eşzamanlı olduğundan emin değilim; site1 ile ilgili son mesaj site2 için ilk mesajdan hemen sonra geldi ve diğer tüm mesajlar sırayla yazdırıldı. Her bir cc işleminin aynı anda ne ölçüde gerçekleştiğini veya sistemin ne ölçüde cpu veya i / o bağlı olabileceğini ölçmedim, ancak nominal olarak çalışıyor gibi görünüyordu.


Buna benzer bir şeyle çalışıyorum ve @siteskomutu kullanarak işleri yapmanın kullanışlı bir yolunu fark ettim . Bununla birlikte, bir aksaklık, site dizini bir symlink ise, komutun onu tanımamasıdır. benim durumumda symlink drupal kökü dışında bir dir olduğunu yani ls- l verir: site_dir -> ../../sites/site/src.. belki de hata beni bina listesi oluşturmak sorumlu koda işaret edebilir eğer düzeltebilirim
awm

1

Tek örnek için (site listesi olmadan):

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

Site listesi dizisine sahip takma adlar için bile eşzamanlı olarak çalışacaktır ...

Aşağıdaki yorumlardan sonra , drush_invoke_process kodunu gözden geçirelim:
//- benim yorumum, /* ... */- sağlanan kodu kısaltma.

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

Sonra denir:

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

Bir sonraki çağrı:

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

Lütfen açıklar mısın? Bir site listesi kullanırken, Drush'un komutları otomatik olarak tüm sitelerde eşzamanlı olarak yürüteceğini mi söylüyorsunuz? Bir Drush destekçisi varsayılan davranışın seri yürütme drupal.org/node/628996#comment-2637008 olduğunu önerdiğinden kafam karıştı .
rcourtna

invoke-multiple, aynı komutu aynı sitede aynı seçenek ve bağımsız değişkenlerle birden çok kez çalıştırmak içindir. Aynı komutu birden çok sitede çalıştırmak için --concurrency = N istiyorsunuz. Her neyse, niyet bu; @Sites veya bir 'site listesi' ile test etmedim, ancak işe yaraması durumunda amaçlanan davranışların dışında dolaşıyorsunuz.
greg_1_anderson

--Concurrency hakkında doğru; --concurrency olmadan ve --invoke-multiple olmadan hata ayıklama modunda birden çok sitede komut çalıştırırsanız, komutun tüm komutları aynı anda çalıştırdığını kolayca görebilirsiniz. Ancak yine, 'invoke-multiple' => TRUE hiçbir şey yapmaz ve site takma adında 2 olarak ayarlamak tüm komutlarınızın iki kez çalışmasını sağlar.
greg_1_anderson

2greg_1_anderson: invoke_multiple ayarı, takma ad veya site listesi ayarlamazsanız çalışır ...
Nikit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.