skip to Main Content

I have been working on a site built on Laravel 4.2 and on Php 7.1. Recently I have been trying to migrate the site to Laravel 6 with php 7.4 and mysql 8. I setup docker with the following settings.

Database File:

FROM mysql:8.0.18
ADD data_x.sql /docker-entrypoint-initdb.d
CMD ["mysqld"]
EXPOSE 3306

Nginx File:

FROM nginx:latest
CMD ["nginx"]
EXPOSE 80 443

Nginx conf:

server {

    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    server_name localhost;
    root /var/www/public/superadmin;
    index index.php index.html index.htm;

    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ .php$ {
        try_files $uri /index.php =404;
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /.ht {
        deny all;
    }

    location /.well-known/acme-challenge/ {
        root /var/www/letsencrypt/;
        log_not_found off;
    }
}

Php-fpm

FROM php:7.4.0-fpm-buster
RUN docker-php-ext-install pdo_mysql
CMD ["php-fpm"]
# Use the default production configuration
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
EXPOSE 9000

docker-compose

version: '3'

services:
  nginx:
    build:
      context: ./nginx
    volumes:
      - ../laravelproject:/var/www
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/sites/:/etc/nginx/sites-available
      - ./nginx/conf.d/:/etc/nginx/conf.d
    depends_on:
      - php-fpm
    ports:
      - "80:80"
      - "443:443"

  php-fpm:
    build:
      context: ./php-fpm
    volumes:
      - ../laravelproject:/var/www
      - ../laravelproject/serve_config/custom.ini:/usr/local/etc/php/conf.d/custom.ini
    links:
      - database:mysql

  database:
    build:
        context: ./database
    environment:
      - MYSQL_DATABASE=mydb
      - MYSQL_USER=myuser
      - MYSQL_PASSWORD=secret
      - MYSQL_ROOT_PASSWORD=docker
    command: ['--default-authentication-plugin=mysql_native_password']
    ports:
      - "3306:3306"

The migration is going smooth, but i noticed the pages load quite slowly.

The same page on my old code running on php 7.1 and Apache takes about 100 – 200ms while my new version would almost take 1 second.

I put an exit in the bootstrap/app.php and it still takes around the same time.
I noticed the app_debug was on and I turned it off and that reduced the delay to around 600 – 700ms to load a ‘hello’ text on a page.

I am wondering is the Docker adding the delay or am I missing any setting on laravel 6 that could be slowing it down.

The opcache is disable on both.

I have been trying to test some time differences. I have not much knowledge of how to do it, but gave it a shot.

The index page first line
old setup – 8ms
Docker setup – 16ms

in bootstrap app.php first line
old setup – 28ms
Docker setup – 106ms

in bootstrap app.php before $app is returned
old setup – 56ms
Docker setup – 206ms

At index.php before app is executed
old setup – 68ms
Docker setup – 254ms

after complete load of app
old setup – 115ms
Docker setup – 1 second (approx)

In laravel 4, we had the $app->run() in the index.php after the $app was returned. In larave 6 we have instead of $app->run().

$kernel = $app->make(IlluminateContractsHttpKernel::class);

$response = $kernel->handle(
    $request = IlluminateHttpRequest::capture()
);

$response->send();

$kernel->terminate($request, $response);

could this be loading something that could be contributing to some latency. I also tried commenting out some middleware and it was still the same.

Every request is taking a long time to load. The fonts are taking 300 ~ 400 ms to load and everyhting is about 10 times slower compared to the old code on apache on Mamp.

2

Answers


  1. Chosen as BEST ANSWER

    I found something that drastically improved the performance. The time stamps for the site on different pages are similar to the bare metal configuration with MAMP.

    I used volume optimisation as explained here: https://engageinteractive.co.uk/blog/making-docker-faster-on-mac


  2. Unfortunately comparing site working in native PHP/MySQL (for example Mamp) with Docker doesn’t make much sense. Docker slows sites a lot (both on Mac and Windows, maybe it’s much better on Linux) so this is normal that site will be much slower.

    If you are concerned about performance you should test it directly on your PC or upload site to some dev server to see site performance.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search