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