Php symfony4在开发中的速度非常慢
我尝试在docker容器上运行一个简单的Symfony 4项目。 我已经测试了常规PHP脚本,它们工作得非常好。但是,在Symfony项目中,执行速度慢得可笑。例如,没有任何重要内容的页面需要5-6秒 我附上了Symfony的性能分析器的截图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
您知道如何将此执行时间减少到可接受的水平吗?更改一致性水平似乎可以极大地提高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 info
# It Should display: Debug Mode: false
在docker配置中禁用:
{
"debug": false,
}
这在docker box中特别慢,用于examle SQLITE缓存:
使用支持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上使用绑定挂载,因为当它们包含大量文件时,绑定挂载速度非常慢<