web-dev-qa-db-fra.com

Symfony 4 est extrêmement lent en DEV

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.

Screenshot1Screenshot2Screenshot3Screenshot4

Avez-vous une idée de comment réduire ce temps d’exécution à un niveau acceptable?

7
user3429660

É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.

1
cepharum

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
3
user3429660