流浪盒上的慢Symfony

时间:2014-10-15 12:11:49

标签: symfony vagrant

我在Windows 7上使用流浪盒进行Symfony2项目。

我配置了nfs:

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise32"
  config.vm.provision :shell, path: "bootstrap.sh"
  config.vm.network :forwarded_port, host: 1234, guest: 80
  config.vm.network "private_network", ip: "192.168.50.4"
  config.vm.synced_folder ".", "/var/www", type: "nfs"
  config.vm.provider "virtualbox" do |v|
    v.memory = 2048
    v.cpus = 2
  end
end

但我的Symfony2 prokect仍然非常慢。

我该怎么办?我找不到一个好的解决方案......

4 个答案:

答案 0 :(得分:4)

cacheDir中的logDirapp/AppKernel.php覆盖到NFS共享之外的目录通常可以提高性能。例如:

public function getCacheDir()
{
    return '/tmp/symfony/cache';
}

public function getLogDir()
{
    return '/tmp/symfony/logs';
}

只有con:您无法检查主机系统中的缓存和日志文件。这也可能意味着您在IDE中丢失了自动完成功能(例如,带有Symfony2插件的PHPStorm)。

答案 1 :(得分:2)

尝试将vendor/移到共享目录之外。

具体程序如下:

http://by-examples.net/2014/12/09/symfony2-on-vagrant.html

答案 2 :(得分:1)

由于在我们的项目中没有任何重新定位供应商文件夹的方法对我有用,我提出了这个解决方案:

  1. 在Vagrant中启用Virtualbox的符号链接。 (出于安全原因,默认情况下禁用此功能,因此仅在开发人员计算机上执行此操作。)请参阅:Symbolic links and synced folders in Vagrant

    config.vm.provider "virtualbox" do |vb|
        vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
    end
    
  2. 在共享目录(通常为“/ vagrant”)之外创建“var”和“vendor”文件夹。 (不要忘记为这些文件夹设置正确的所有者。)

    mkdir -p /var/cache/MyProject/var
    mkdir -p /var/cache/MyProject/vendor
    
  3. 将它们链接到共享文件夹(“/ vagrant”)。 (删除已存在的文件夹。)

    ln -s /var/cache/MyProject/var /vagrant/var
    ln -s /var/cache/MyProject/vendor /vagrant/vendor
    
  4. 仅在前面的步骤之后执行“composer install”。

  5. 由于搬迁,我获得了4-6倍的加速。

答案 3 :(得分:0)

更新:实际上,这不是一个好的解决方案,因为Lsync依靠inotify来检测更改,并且共享文件夹不支持IIRC inotify。 Lsync能够检测和同步新创建的文件,但无法检测文件内容何时更改。我仍将“半解决方案”保留在那里,因为我没有时间正确调试它,它可以帮助其他人找到有关OP问题的更好解决方案。

-

不幸的是,我对大多数解决方案都不满意,因为它们仍然太慢或与我的主机(Windows)不兼容。 我正在Windows 10上使用Vagrant(ubuntu / xenial64)运行Symfony 4,我的解决方案是将shared/www(主机)目录的内容同步(使用lsyncd)到/var/www/(来宾)。 / p>

在主机上

因此,首先,您需要在Vagrantfile所在的位置创建以下目录:

  • 共享
  • 共享/ www

接下来,按照以下步骤编辑您的Vagrantfile:
config.vm.synced_folder ".", "/vagrant", owner: "www-data", group: "www-data", mount_options: ["dmode=775,fmode=777"]

在访客上

为了同步文件,您需要安装lsyncd
sudo apt install lsyncd

安装后,您将必须为lsyncd手动创建所需的文件/目录:
sudo mkdir /var/log/lsyncd
sudo touch /var/log/lsyncd/lsyncd.log
sudo touch /var/log/lsyncd/lsyncd.status
sudo touch /etc/lsyncd/lsyncd.conf.lua

然后,用您喜欢的编辑器编辑配置文件(/etc/lsyncd/lsyncd.conf.lua)并放置以下内容:

settings {
        insist = true,
        logfile = "/var/log/lsyncd/lsyncd.log",
        statusFile = "/var/log/lsyncd/lsyncd.status",
        statusInterval = 1
}

sync {
        default.rsync,
        delay = 1,
        source = "/vagrant/shared/www/",
        target = "/var/www/",
        rsync = {
                verbose = true,
                update = true,
                perms = true,
                owner = true,
                group = true,
        }
}

您可以在this page上获得有关配置文件的更多信息。

请注意,lsyncd单向同步文件,如您所见,源目录为/vagrant/shared/www/,目标目录为/var/www。这意味着当lsyncd检测到/vagrant/shared/www/中的更改时,它将自动将更改后的文件发送到/var/www。但是,如果/var/www中有更改,则lsyncd不会将更改后的文件发送到源目录。

因此,在您的Symfony src /文件夹中,按如下所示编辑Kernel.php文件:

/**
 * Moves log dir for better performances to a non-shared folder
 *
 * @return string
 */
public function getLogDir()
{
    return '/tmp/symfony/var/' . $this->environment . '/log';
}

/**
 * Moves cache dir for better performances to a non-shared folder
 *
 * @return string
 */
public function getCacheDir()
{
    return '/tmp/symfony/var/' . $this->environment . '/cache';
}

这样做,我的应用程序仅在〜50ms内加载,因为它不再位于共享文件夹中。当我从主机(共享的/ www)编辑我的应用程序文件时,编辑后的文件将自动同步到客户机(/ var / www /),并且网络服务器将直接从/ var / www /提供服务这就是为什么它很快的原因。