Symfony2 和 Twig 在 vagrant box 中的表现

Posted

技术标签:

【中文标题】Symfony2 和 Twig 在 vagrant box 中的表现【英文标题】:Symfony2 and Twig performance in a vagrant box 【发布时间】:2014-11-24 08:35:40 【问题描述】:

先决条件:

    http://box.scotch.io/流浪盒子

    2.
# -*- mode: ruby -*-
# vi: set ft=ruby :


Vagrant.configure("2") do |config|

  config.vm.box = "scotch/box"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.network "forwarded_port", guest: 80, host: 80
  config.vm.network "forwarded_port", guest: 3306, host: 3306
  config.vm.network "forwarded_port", guest: 443, host: 443
  config.vm.network "forwarded_port", guest: 1081, host: 1081
  config.vm.hostname = "scotchbox"
  config.vm.synced_folder "../../../project", "/var/www", :mount_options => ["dmode=777", "fmode=666", "uid=1000", "gid=1000"], type: "nfs"
  #config.vm.synced_folder "./mysql", "/var/lib/mysql", :mount_options => ["dmode=700", "fmode=600", "uid=106", "gid=112"], type: "nfs"
  config.vm.synced_folder "../../../project/_conf", "/etc/apache2/sites-enabled", :mount_options => ["dmode=755", "fmode=644", "uid=0", "gid=0"], type: "nfs"

#############################


$script = <<SCRIPT
  sudo service apache2 restart && sudo service mysql start 
SCRIPT

  config.vm.provision "shell", inline: $script, privileged: false, run: "always"
end
    symfony2 项目在盒子内运行。这是 composer.json 的 require 部分
    "require": 
        "php": ">=5.3.3",
        "symfony/symfony": "2.2.*",
        "doctrine/orm": "~2.2,>=2.2.3",
        "doctrine/doctrine-bundle": "1.2.*",
        "twig/extensions": "1.0.*",
        "symfony/assetic-bundle": "2.1.*",
        "symfony/swiftmailer-bundle": "2.2.*",
        "symfony/monolog-bundle": "2.2.*",
        "sensio/distribution-bundle": "2.2.*",
        "sensio/framework-extra-bundle": "2.2.*",
        "sensio/generator-bundle": "2.3.*",
        "jms/security-extra-bundle": "1.4.*",
        "jms/di-extra-bundle": "1.3.*",
        "kriswallsmith/assetic": "v1.1.0-alpha4",
        "gedmo/doctrine-extensions": "dev-master",
        "stof/doctrine-extensions-bundle": "dev-master",
        "doctrine/doctrine-fixtures-bundle": "dev-master",
        "mopa/bootstrap-bundle": "2.2.x-dev",
        "twbs/bootstrap": "2.3.1",
        "jlong/sass-twitter-bootstrap": "2.3.1",
        "liip/theme-bundle": "dev-master",
        "fkr/cssurlrewrite-bundle": "*",
        "knplabs/knp-paginator-bundle": "dev-master",
        "knplabs/knp-components": "dev-master#f096dd02136957ce1fba5819261a45b3ee9ed4a7",
        "craue/formflow-bundle": "dev-master",
        "sonata-project/admin-bundle": "dev-master",
        "sonata-project/cache-bundle": "dev-master",
        "sonata-project/doctrine-orm-admin-bundle": "dev-master",
        "avalanche123/imagine-bundle": "v2.1",
        "r1pp3rj4ck/TwigstringBundle": "dev-master",
        "raulfraile/ladybug-bundle": "1.0.1"
    ,

问题:

即使是打开一个空白页面(如登录表单),也需要很长时间。正如在分析器中看到的,大部分时间都花在了 twig 渲染上:

Twig taking 3.5 seconds to render

我尝试过的:

    正如您在 Vagrantfile 中看到的,NFS 已启用。不知道如何测试它 阅读this 和this。您在上面的屏幕截图中看到的测试是在这些更改完成后运行的

【问题讨论】:

第一个请求和所有后续请求需要 3.5 秒还是只需要第一个?如果只是第一个,那就是缓存的创建需要很多时间。你有 5400 RPM 硬盘吗? 见下面我的回答,这在所有后续请求中都可以重现,所以这不是缓存初始生成的问题。我在 SSD 上测试过 【参考方案1】:

如果您的主机操作系统是 Win(在我的情况下为 Windows 7 x64),为了使其在 vagrant 中更快地工作,您需要:

    添加this 修复。我还在列表中添加了“prod”环境:
public function getCacheDir()

    if (in_array($this->environment, array('dev', 'test', 'prod'))) 
        return '/dev/shm/project/cache/' .  $this->environment;
    

    return parent::getCacheDir();


public function getLogDir()

    if (in_array($this->environment, array('dev', 'test', 'prod'))) 
        return '/dev/shm/project/logs';
    

    return parent::getLogDir();

    利用 NFS 修复 I/O 性能。问题是我很困惑:在 synced_folders 中设置 nfs=true 选项并不意味着您正在通过 NFS 进行连接。我的主机操作系统是 Win7,我必须安装 NFS server 才能使其工作。请注意,它不是免费的。 以下是我必须分享的两个文件夹:

另外,使用 synced_folder 挂载对我不起作用,因为 NFS 服务器只监听特定的 IP 地址,所以我不得不注释掉这个:

config.vm.synced_folder "../../../project", "/var/www", type: "nfs",:nfs => true

并把它改为:

$script = <<SCRIPT
  sudo mount 192.168.178.40:/d/project /var/www/ && sudo mount 192.168.178.40:/d/project/_conf /etc/apache2/sites-enabled && sudo service apache2 restart
SCRIPT

  config.vm.provision "shell", inline: $script, privileged: false, run: "always"

,其中 192.168.178.40 是开放 NFS 端口的 IP。您可以从您的 gurest 操作系统扫描它,例如地图。

    您还需要安装名为 vagrant-winnfsd 的 vagrant 插件。可以通过以下方式完成:

vagrant 插件安装 vagrant-winnfsd

【讨论】:

【参考方案2】:

我认为这不是树枝性能的问题,而是 VirtualBox/vagrant 中的目录共享问题。尝试在 VirtualBox 中启用 I/O 缓存。

【讨论】:

目前我正在使用 VirtualBox,在“修复”失败后(同样的问题)我将代码移动到 VM 并通过 Samba 将其共享到 Windows... 你对 I/O 性能的看法是对的,但我现在就回答我的问题,也许它对某人有用

以上是关于Symfony2 和 Twig 在 vagrant box 中的表现的主要内容,如果未能解决你的问题,请参考以下文章

使用 Twig 和 Symfony2 在 javascript 中生成路由

使用 Assetic / Twig / Symfony2,我可以定义前端库吗?

Vagrant 和 symfony2

Twig 和 Symfony2 - 找不到实体

尝试在我的项目中实现没有 Symfony2 的 Twig 和 Assetic

在带有 Symfony2 的 Twig 中使用 % stylesheets % 标签时通过 Twig 运行 CSS 文件