Php symfony4在开发中的速度非常慢

Php symfony4在开发中的速度非常慢,php,symfony,docker,symfony4,Php,Symfony,Docker,Symfony4,我尝试在docker容器上运行一个简单的Symfony 4项目。 我已经测试了常规PHP脚本,它们工作得非常好。但是,在Symfony项目中,执行速度慢得可笑。例如,没有任何重要内容的页面需要5-6秒 我附上了Symfony的性能分析器的截图 您知道如何将此执行时间减少到可接受的水平吗?更改一致性水平似乎可以极大地提高Symfony的性能。(见附件) 这是我的新docker-compose.yml文件。请注意卷后面的“:cached” version: '3' services: web

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

我附上了Symfony的性能分析器的截图


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

更改一致性水平似乎可以极大地提高Symfony的性能。(见附件)

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

version: '3'
services:
  web:
    image: apache-php7
    ports:
     - "80:80"
    volumes:
      - .:/app:cached
    tty: true
手册中的注释:

对于使用缓存装载的目录,主机的文件视图 制度权威;容器执行的写入是 对主机立即可见,但在此之前可能会有延迟 在主机上执行的写入操作在容器中可见


由于提供的答案仅适用于macOSX,但Docker for Windows也存在性能问题,因此首选答案对我的情况没有帮助。我采用了不同的方法,在这里类似问题的答案中有部分描述

根据Symfony应用程序中负载较重的文件夹,例如
供应商
var
,不应成为共享装载的一部分。如果需要保留这些文件夹,则应使用卷

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

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

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

RUN mkdir /app && mkdir /symfony/{var,vendor}

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

VOLUME /symfony/var
VOLUME /symfony/vendor
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
    && apt-get update &&  apt-get install -y --no-install-recommends \
        locales apt-utils git \
    \
    && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen  \
    && echo "fr_FR.UTF-8 UTF-8" >> /etc/locale.gen \
    &&  locale-gen \
以下是我在调用
composer update
或通过
bin/console
调用任何任务之前向启动脚本添加的内容:

[ -e /app/var ] || ln -s /symfony/var /app/var
[ -e /app/vendor ] || ln -s /symfony/vendor /app/vendor
这就是我的作文最终的样子:

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毫秒内响应,而不是在4000毫秒或更长时间内响应

更新:当使用IDE开发基于Symfony的应用程序(如PhpStorm)时,您可能需要供应商/中的文件以获得代码帮助或类似功能。在我的例子中,我能够拍摄这些文件的快照,并将它们放在另一个文件夹中,该文件夹也与主机共享,但Symfony/PSR不积极使用,例如,vendor.dis/。此快照在每次安装/升级时手动拍摄一次,例如,通过使用shell(如下所示)进入正在运行的容器:

docker exec -it IDofContainer /bin/sh
然后在shell中调用

cp -Lr vendor vendor.dis
也许你必须先修复路径名或确保切换到包含应用程序的文件夹

在我使用phpsform的例子中,vendor.dis/是通过后台索引获取的,并由代码检查和代码帮助遵守。VisualStudio代码对git进行了大量未跟踪的更改,因此我必须显式地使git忽略此快照,并将其名称添加到.gitignore文件中

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

  • 不同步供应商文件夹

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

    #DockerFile:
    
      volumes:
        - /local/app:/var/www/html/app
        - /var/www/html/app/vendor # ignore vendor folder
    
    这将导致您需要在生成后以及更新composer依赖项时手动将供应商文件夹复制到容器中:

    docker cp  /local/app/vendor <CONTAINER_ID>:/var/www/html/app/
    
  • 在委派模式下同步应用程序文件夹

  • 对开发环境上的卷装载使用委派模式:

    委托:容器的视图具有权威性(允许在 容器上的更新显示在主机中)

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

      volumes:
        - /local/app:/var/www/html/app:delegated
    
  • 禁用Docker调试模式

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

    docker info
    # It Should display: Debug Mode: false
    
    在docker配置中禁用:

    {
      
      "debug": false,
    } 
    
  • 不要使用文件缓存

  • 这在docker box中特别慢,用于examle SQLITE缓存:

  • 适用于Windows 10用户:使用支持WSL 2的Docker桌面

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


    集装箱性能还有一个非常重要的因素。 有必要检查Dockerfile是否包含不必要的层的构建

    比如说,

    错误做法->使用多个不必要的链式运行

    最佳实践->尽可能多地使用&&fromshell for chianed命令

    e、 例如,g

    我们可以在Dockerfile中写下:

    RUN mkdir /app && mkdir /symfony/{var,vendor}
    
    COPY setup-symfony.sh /setup-symfony.sh
    
    VOLUME /symfony/var
    VOLUME /symfony/vendor
    
    RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
        && apt-get update &&  apt-get install -y --no-install-recommends \
            locales apt-utils git \
        \
        && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen  \
        && echo "fr_FR.UTF-8 UTF-8" >> /etc/locale.gen \
        &&  locale-gen \
    
    而不是:

    RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf 
    RUN apt-get update &&  apt-get install -y --no-install-recommends \
        locales apt-utils git 
    
    RUN  echo "en_US.UTF-8 UTF-8" > /etc/locale.gen  \
         && echo "fr_FR.UTF-8 UTF-8" >> /etc/locale.gen 
    RUN  locale-gen
    
    更多层提高容器的速度。。。检查您的服务器Dockerfiles好友


    我希望这条评论对某些人有所帮助

    您可以避免在Mac或Windows上使用绑定挂载,因为当它们包含大量文件时,绑定挂载速度非常慢<