Saya menggunakan Drupal multi-situs (basis kode tunggal, beberapa situs / *). Seiring dengan ini, saya sudah mulai menggunakan alias Drush untuk mengelolanya:
$ cat sites/all/drush/aliases.drushrc.php
<?php
$aliases['localdev'] = array(
'site-list' => array(
'site1',
'site2',
'site3',
),
);
?>
Ini memungkinkan saya untuk dengan mudah melakukan tindakan di semua situs:
$ drush @localdev cc all
>> Saya juga baru tahu bahwa saya bisa menggunakan @Situs , dan melupakan file drushrc .
Melakukan ini, akan menjalankan "cc all" di setiap situs saya secara seri (satu per satu).
Saya ingin membawa ini ke level berikutnya dan mencoba menjalankan perintah ini di semua situs secara simultan . Saya telah melakukan beberapa bacaan, dan am di bawah kesan bahwa Drush tidak memang mendukung ini. Fungsi drush_invoke_process () membutuhkan $ backend_options, yang dapat berisi (dari dokumentasi fungsi):
* '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'.
Apa yang saya tidak tahu, bagaimanapun, adalah bagaimana saya benar-benar menggunakan ini dari baris perintah Drush . Apakah ada opsi yang perlu saya sampaikan ke Drush, atau apakah saya perlu mengatur sesuatu di file pengaturan?
Info apa pun akan sangat dihargai - keingintahuan saya terguncang!
MEMPERBARUI
Berdasarkan jawaban di bawah ini, saya dapat membuat tes sederhana yang menunjukkan perilaku Drush, dan menarik beberapa kesimpulan:
Perilaku default Drush ketika menjalankan operasi di banyak situs adalah menggunakan proses bersamaan:
$ drush @localdev ev "drupal_set_message(time()); sleep(5);"
Continue? (y/n): y
site1 >> 1360512943 [status]
site2 >> 1360512943 [status]
site3 >> 1360512943 [status]
Ini benar bahkan ketika tidak menggunakan alias, dan juga benar ketika menggunakan alias situs bawaan Drush. Dua perintah ini menghasilkan perilaku yang identik seperti di atas:
$ drush site1,site2,site3 ev "drupal_set_message(time()); sleep(5);"
$ drush @sites ev "drupal_set_message(time()); sleep(5);"
Untuk mengubah jumlah proses bersamaan (default adalah 4), opsi '--concurrency = N' dapat diteruskan dalam perintah drush. Misalnya, jika saya ingin eksekusi serial, saya dapat mengatur jumlah proses bersamaan menjadi 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]
sumber
Jawaban:
Ini bekerja untuk saya:
Saya tidak yakin seberapa serentak itu sebenarnya; pesan terakhir tentang site1 datang segera setelah pesan pertama untuk site2, dan semua pesan lainnya dicetak secara berurutan. Saya tidak mengukur sampai sejauh mana setiap operasi cc terjadi secara bersamaan, atau sejauh mana sistem tersebut mungkin hanya cpu atau i / o terikat, tetapi tampaknya secara nominal berfungsi.
sumber
@sites
perintah. Namun, satu kesalahan dengan itu adalah bahwa jika direktori situs adalah symlink, perintah itu tidak mengenalinya. dalam kasus saya symlink adalah ke dir di luar drupal root jadi ls- l memberikan:site_dir -> ../../sites/site/src
..mungkin itu bug yang bisa saya perbaiki jika Anda bisa mengarahkan saya ke kode yang bertanggung jawab untuk membuat daftar thelistUntuk satu contoh (tanpa daftar situs):
Untuk alias dengan susunan daftar situs, ia akan berjalan secara bersamaan bahkan ...
Setelah komentar di bawah , mari kita tinjau kode untuk drush_invoke_process:
//
- komentar saya,/* ... */
- memperpendek kode yang disediakan.Selanjutnya disebut:
Selanjutnya akan dipanggil:
sumber