J'essaie de lancer un projet Symfony 4 simple sur un conteneur Docker. J'ai testé les scripts PHP réguliers, et ils fonctionnent très bien. Mais, avec le projet Symfony, l'exécution devient ridiculement lente. Par exemple, une page sans contenu significatif prend 5-6 secondes.
J'ai joint les captures d'écran du profileur de performances de Symfony.
Avez-vous une idée de comment réduire ce temps d’exécution à un niveau acceptable?
Étant donné que la réponse fournie ne fonctionne que sous macOSX, des problèmes de performances existent toutefois avec Docker pour Windows. Par conséquent, la réponse préférée ne m'a pas aidé. Je suivais une approche différente partiellement décrite dans les réponses à des questions similaires sur SO.
Selon Meilleures pratiques en matière de performances Les dossiers avec une charge importante tels que vendor
et var
dans une application Symfony ne doivent pas faire partie d'un montage partagé. Si vous souhaitez conserver ces dossiers, utilisez plutôt des volumes.
Pour éviter les interférences avec le volume partagé dans /app
, je déplaçais ces deux dossiers dans un dossier séparé /symfony
dans le conteneur. Dans Dockerfile, les dossiers /symfony/var
et /symfony/vendor
sont également créés.
Le script exécuté au début du conteneur définit des liens symboliques de /app/var
à /symfony/var
et de /app/vendor
à /symfony/vendor
. Ces deux nouveaux dossiers sont ensuite montés sur des volumes, par exemple. dans un fichier docker-compose.yml
.
Voici ce que j'étais en ajoutant à mon fichier Docker:
RUN mkdir /app && mkdir /symfony/{var,vendor}
COPY setup-symfony.sh /setup-symfony.sh
VOLUME /symfony/var
VOLUME /symfony/vendor
Voici ce que j’étais en ajoutant à mon script de démarrage juste avant d’appeler composer update
ou une tâche quelconque via bin/console
:
[ -e /app/var ] || ln -s /symfony/var /app/var
[ -e /app/vendor ] || ln -s /symfony/vendor /app/vendor
Voici à quoi ma composition ressemble finalement:
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:
En utilisant cette configuration, Symfony répond dans un délai de 500 ms au lieu de prendre 4000 ms et plus.
Il semble que la modification du niveau de cohérence augmente considérablement les performances de Symfony. (voir Docker docs )
Voici mon nouveau fichier docker-compose.yml. Notez le ": mis en cache" après le volume.
version: '3'
services:
web:
image: Apache-php7
ports:
- "80:80"
volumes:
- .:/app:cached
tty: true