首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony 4在DEV中缓慢得令人痛苦

Symfony 4在DEV中缓慢得令人痛苦
EN

Stack Overflow用户
提问于 2018-02-17 23:38:40
回答 7查看 20.1K关注 0票数 18

我尝试在一个码头容器上运行一个简单的Symfony 4项目。我已经测试了常规的PHP脚本,它们运行得非常好。但是,使用Symfony项目,执行速度会变得异常缓慢。例如,没有任何重要内容的页面需要5-6秒。

我已经附上了从Symfony的性能分析器截图。

您知道如何将此执行时间减少到可接受的水平吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2018-10-01 08:07:38

由于所提供的答案只适用于macOSX,但Docker也存在性能问题,在我的情况下,首选的答案没有帮助。我采用的是对类似问题的部分回答中所描述的不同方法。

根据业绩最佳做法,重载的文件夹(如Symfony应用程序中的vendorvar )不应该是共享挂载的一部分。如果需要持久化这些文件夹,则应该使用卷。

为了防止对/app中共享卷的干扰,我将这两个文件夹重新定位为将容器中的文件夹/symfony分开。此外,还在Dockerfile文件夹中创建了/symfony/var/symfony/vendor

在容器开始时运行的脚本正在设置从/app/var/symfony/var和从/app/vendor/symfony/vendor的符号链接。然后将这两个新文件夹挂载到卷中,例如在一个docker-compose.yml文件中。

下面是我在中添加到Dockerfile中的内容:

代码语言:javascript
复制
RUN mkdir /app && mkdir /symfony/{var,vendor}

COPY setup-symfony.sh /setup-symfony.sh

VOLUME /symfony/var
VOLUME /symfony/vendor

下面是在调用composer update或通过bin/console调用任何任务之前将添加到启动脚本中的内容

代码语言:javascript
复制
[ -e /app/var ] || ln -s /symfony/var /app/var
[ -e /app/vendor ] || ln -s /symfony/vendor /app/vendor

这就是我的作文最终的样子:

代码语言:javascript
复制
version: "3.5"
services:
  database:
    build:
      context: docker/mysql
    volumes:
      - "dbdata:/var/lib/mysql"
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 1

  application:
    depends_on:
      - database
    build:
      context: docker/lamps
    ports:
      - "8000:8000"
    volumes:
      - ".:/app:cached"
      - "var:/symfony/var"
      - "vendor:/symfony/vendor"
    environment:
      DATABASE_URL: mysql://dbuser:dbuser@database/dbname

volumes:
  dbdata:
  var:
  vendor:

使用此设置,Symfony在500 is内响应,而不是使用4000 is或更多。

更新:当使用IDE开发基于PhpStorm的基于Symfony的应用程序时,您可能需要供应商/中的文件来进行代码辅助或类似的操作。在我的例子中,我能够捕捉到这些文件的快照,并将它们放到与主机共享的不同文件夹中,但Symfony/PSR没有积极使用它们,例如vendor.dis/.此快照在每次安装/升级时手动拍摄一次,例如,使用shell输入正在运行的容器,如下所示:

代码语言:javascript
复制
docker exec -it IDofContainer /bin/sh

然后在shell调用中

代码语言:javascript
复制
cp -Lr vendor vendor.dis

也许你必须修复路径名,或者确保先切换到包含应用程序的文件夹。

在我的例子中,使用PhpStorm的供应商/是通过后台索引获取的,并通过代码检查和代码辅助来执行。Visual代码与git相关的大量未跟踪更改存在问题,因此我不得不显式地使此快照被git忽略,并将其名称添加到.gitignore文件中。

更新2020:最近的设置可能在访问诸如/symfony/templates/symfony/public之类的文件夹方面出现问题,例如在缓存的热身方面。这显然是由于在自动加载代码中使用相对文件夹,由于上述的重新定位,/symfony/vendor中现在已经存在了这些文件夹。作为一种选择,您可以直接在/app/var/app/vendor中安装额外的卷,而不是/symfony/var/symfony/vendor。在/app/var.dis/app/vendor.dis中创建这些文件夹的深层副本可以在主机文件系统中启用代码辅助和检查。

票数 16
EN

Stack Overflow用户

发布于 2018-02-19 08:39:38

改变一致性级别似乎大大提高了Symfony的性能。(见码头医生)

这是我的新的docker-compose.yml文件。请注意":cached“后面的volumne。

代码语言:javascript
复制
version: '3'
services:
  web:
    image: apache-php7
    ports:
     - "80:80"
    volumes:
      - .:/app:cached
    tty: true

手册中的说明:

对于装入缓存的目录,主机对文件系统的视图是权威的;容器执行的写入对主机来说是立即可见的,但是在主机上执行的写入在容器中可见之前,可能会有一个延迟。

票数 19
EN

Stack Overflow用户

发布于 2020-03-25 08:53:28

  1. 不要同步供应商文件夹

在您的停靠文件中,可以防止供应商文件夹与容器同步。这对性能的影响最大,因为文件夹变得非常大:

代码语言:javascript
复制
#DockerFile:

  volumes:
    - /local/app:/var/www/html/app
    - /var/www/html/app/vendor # ignore vendor folder

这将导致您需要在构建之后和更新编写器依赖项时将供应商文件夹手动复制一次到容器:

代码语言:javascript
复制
docker cp  /local/app/vendor <CONTAINER_ID>:/var/www/html/app/
  1. 不要同步缓存文件夹

在src/Kernel.php中

代码语言:javascript
复制
public function getCacheDir()
{
    // for docker performance
    if ($this->getEnvironment() === 'test' || $this->getEnvironment() === 'dev') {
        return '/tmp/'.$this->environment;
    } else {
        return $this->getProjectDir().'/var/cache/'.$this->environment;
    }

}
  1. 在缓存模式下同步应用程序文件夹

对开发环境上的卷安装使用缓存模式:http://docs.docker.oeynet.com/docker-for-mac/osxfs-caching/#delegated

缓存的配置提供了委托配置的所有保证,以及关于容器执行的写操作的可见性的一些附加保证。因此,缓存通常会提高读重工作负载的性能,代价是主机和容器之间存在一些暂时的不一致。 对于装入缓存的目录,主机对文件系统的视图是权威的;容器执行的写入对主机是立即可见的,但是在主机上执行的写入在容器中可见之前可能会出现延迟。

这对于dev envrionemtns来说是有意义的,因为通常您在主机上而不是容器中用IDE更改代码并同步到容器中。#DockerFile:

代码语言:javascript
复制
  volumes:
    - /local/app:/var/www/html/app:cached
  1. 禁用码头调试模式

检查Docker是否处于调试模式:

代码语言:javascript
复制
docker info
# It Should display: Debug Mode: false

在docker-config中禁用:

代码语言:javascript
复制
{
  
  "debug": false,
} 
  1. 不要使用文件缓存。

这在停靠箱中是非常慢的,例如SQLITE缓存:Symfony Sqlite缓存

  1. for Windows 10用户:使用带有WSL 2支持的Desktop

使用带有WSL 2支持的Docker Desktop,这通常会提高性能:

https://docs.docker.com/docker-for-windows/wsl/

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48846995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档