私が働いているところでは、Vagrant+Symfonyが遅いという問題に対して2つの解決策を試しました。2番目のもの(nfsとバインドマウント)をお勧めします。
rsyncアプローチ
まず、rsyncを使用しました。私たちのアプローチは、AdrienBraultの回答で概説されているものとは少し異なりました。むしろ、次のようなコードが含まれていますVagrantfile
。
config.vm.define :myproj01 do |myproj|
# Networking & Port Forwarding
myproj.vm.network :private_network, type: "dhcp"
# NFS Share
myproj.vm.synced_folder ".", "/home/vagrant/current", type: 'rsync', rsync__exclude: [
"/.git/",
"/vendor/",
"/app/cache/",
"/app/logs/",
"/app/uploads/",
"/app/downloads/",
"/app/bootstrap.php.cache",
"/app/var",
"/app/config/parameters.yml",
"/composer.phar",
"/web/bundles",
"/web/uploads",
"/bin/behat",
"/bin/doctrine*",
"/bin/phpunit",
"/bin/webunit",
]
# update VM sooner after files changed
# see https://github.com/smerrill/vagrant-gatling-rsync#working-with-this-plugin
config.gatling.latency = 0.5
end
上記からお気づきかもしれませんが、Vagrantgatlingrsyncプラグインを使用してファイルの同期を維持しました。
バインドマウントを使用した、改善されたNFSアプローチ(推奨ソリューション)
rsyncアプローチは速度の問題を解決しますが、いくつかの問題が見つかりました。特に、(フォルダーの共有とは対照的に)一方向の性質はcomposer.lock
、VMでファイル(またはDoctrineの移行など)が生成されたとき、またはのコードにアクセスしたいときに厄介でした/vendor
。コピーして戻すにはSFTPを使用する必要がありました。新しいファイルの場合は、ガトリングプラグインの次の実行でクリアされる前にSFTPで実行してください。
そのため、バインディングマウントを使用して、キャッシュやログなどのフォルダーを異なる方法で処理するソリューションに移行しました。それらを共有しないと、速度が劇的に向上しました。
Vagrantfileの関連ビットは次のとおりです。
# Binding mounts for folders with dynamic data in them
# This must happen before provisioning, and on every subsequent reboot, hence run: "always"
config.vm.provision "shell",
inline: "/home/vagrant/current/bin/bind-mounts",
run: "always"
上で参照したbind-mounts
スクリプトは次のようになります。
#!/bin/bash
mkdir -p ~vagrant/current/app/downloads/
mkdir -p ~vagrant/current/app/uploads/
mkdir -p ~vagrant/current/app/var/
mkdir -p ~vagrant/current/app/cache/
mkdir -p ~vagrant/current/app/logs/
mkdir -p ~vagrant/shared/app/downloads/
mkdir -p ~vagrant/shared/app/uploads/
mkdir -p ~vagrant/shared/app/var/
mkdir -p ~vagrant/shared/app/cache/
mkdir -p ~vagrant/shared/app/logs/
sudo mount -o bind ~vagrant/shared/app/downloads/ ~/current/app/downloads/
sudo mount -o bind ~vagrant/shared/app/uploads/ ~/current/app/uploads/
sudo mount -o bind ~vagrant/shared/app/var/ ~/current/app/var/
sudo mount -o bind ~vagrant/shared/app/cache/ ~/current/app/cache/
sudo mount -o bind ~vagrant/shared/app/logs/ ~/current/app/logs/
NFS +バインディングマウントは、私がお勧めするアプローチです。