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




您知道如何将此执行时间减少到可接受的水平吗?
发布于 2018-10-01 08:07:38
由于所提供的答案只适用于macOSX,但Docker也存在性能问题,在我的情况下,首选的答案没有帮助。我采用的是对类似问题的部分回答中所描述的不同方法。
根据业绩最佳做法,重载的文件夹(如Symfony应用程序中的vendor和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下面是在调用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 is内响应,而不是使用4000 is或更多。
更新:当使用IDE开发基于PhpStorm的基于Symfony的应用程序时,您可能需要供应商/中的文件来进行代码辅助或类似的操作。在我的例子中,我能够捕捉到这些文件的快照,并将它们放到与主机共享的不同文件夹中,但Symfony/PSR没有积极使用它们,例如vendor.dis/.此快照在每次安装/升级时手动拍摄一次,例如,使用shell输入正在运行的容器,如下所示:
docker exec -it IDofContainer /bin/sh然后在shell调用中
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中创建这些文件夹的深层副本可以在主机文件系统中启用代码辅助和检查。
发布于 2018-02-19 08:39:38
改变一致性级别似乎大大提高了Symfony的性能。(见码头医生)
这是我的新的docker-compose.yml文件。请注意":cached“后面的volumne。
version: '3'
services:
web:
image: apache-php7
ports:
- "80:80"
volumes:
- .:/app:cached
tty: true手册中的说明:
对于装入缓存的目录,主机对文件系统的视图是权威的;容器执行的写入对主机来说是立即可见的,但是在主机上执行的写入在容器中可见之前,可能会有一个延迟。
发布于 2020-03-25 08:53:28
在您的停靠文件中,可以防止供应商文件夹与容器同步。这对性能的影响最大,因为文件夹变得非常大:
#DockerFile:
volumes:
- /local/app:/var/www/html/app
- /var/www/html/app/vendor # ignore vendor folder这将导致您需要在构建之后和更新编写器依赖项时将供应商文件夹手动复制一次到容器:
docker cp /local/app/vendor <CONTAINER_ID>:/var/www/html/app/在src/Kernel.php中
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;
}
}对开发环境上的卷安装使用缓存模式:http://docs.docker.oeynet.com/docker-for-mac/osxfs-caching/#delegated
缓存的配置提供了委托配置的所有保证,以及关于容器执行的写操作的可见性的一些附加保证。因此,缓存通常会提高读重工作负载的性能,代价是主机和容器之间存在一些暂时的不一致。 对于装入缓存的目录,主机对文件系统的视图是权威的;容器执行的写入对主机是立即可见的,但是在主机上执行的写入在容器中可见之前可能会出现延迟。
这对于dev envrionemtns来说是有意义的,因为通常您在主机上而不是容器中用IDE更改代码并同步到容器中。#DockerFile:
volumes:
- /local/app:/var/www/html/app:cached检查Docker是否处于调试模式:
docker info
# It Should display: Debug Mode: false在docker-config中禁用:
{
"debug": false,
} 这在停靠箱中是非常慢的,例如SQLITE缓存:Symfony Sqlite缓存
使用带有WSL 2支持的Docker Desktop,这通常会提高性能:
https://stackoverflow.com/questions/48846995
复制相似问题