簡體   English   中英

docker 上帶有 Nginx、php 7.4 fpm 和 mysql 8 的 Laravel 6 比 php 7.1 上的 Laravel 4 慢

[英]Laravel 6 with Nginx, php 7.4 fpm and mysql 8 on docker is slower than Laravel 4 on php 7.1

我一直在開發基於 Laravel 4.2 和 PHP 7.1 的網站。 最近我一直在嘗試使用 php 7.4 和 mysql 8 將站點遷移到 Laravel 6。我使用以下設置設置了 docker。

數據庫文件:

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

Nginx 文件:

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

Nginx 配置:

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"

遷移進行得很順利,但我注意到頁面加載速度很慢。

我在 php 7.1 和 Apache 上運行的舊代碼的同一頁面大約需要 100 - 200 毫秒,而我的新版本幾乎需要 1 秒。

我在 bootstrap/app.php 中放置了一個出口,它仍然需要大約相同的時間。 我注意到 app_debug 已打開,我將其關閉,這將延遲減少到大約 600 - 700 毫秒以在頁面上加載“你好”文本。

我想知道是 Docker 增加了延遲,還是我錯過了 laravel 6 上可能會減慢它的任何設置。

兩者都禁用了 opcache。

我一直在嘗試測試一些時差。 我對如何做到這一點知之甚少,但試了一下。

索引頁第一行
舊設置 - 8ms
Docker 設置 - 16 毫秒

在 bootstrap app.php 第一行
舊設置 - 28ms
Docker 設置 - 106 毫秒

在 $app 返回之前的 bootstrap app.php 中
舊設置 - 56ms
Docker 設置 - 206 毫秒

在應用程序執行之前的 index.php
舊設置 - 68ms
Docker 設置 - 254 毫秒

應用程序完全加載后
舊設置 - 115ms
Docker 設置 - 1 秒(大約)

在 Laravel 4 中,我們在 $app 返回后在 index.php 中有 $app->run() 。 在 larave 6 中,我們用 $app->run() 代替了。

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

$response->send();

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

這是否正在加載可能導致某些延遲的內容。 我也試過注釋掉一些中間件,結果還是一樣。

每個請求都需要很長時間才能加載。 字體加載需要 300 ~ 400 毫秒,並且與 Mamp 上的 apache 上的舊代碼相比,每一個都慢了大約 10 倍。

不幸的是,將在本機 PHP/MySQL(例如 Mamp)中工作的站點與 Docker 進行比較並沒有多大意義。 Docker 會大大降低站點的速度(在 Mac 和 Windows 上,也許在 Linux 上會好得多),因此站點會慢得多是正常的。

如果您擔心性能,您應該直接在您的 PC 上測試它或將站點上傳到某個開發服務器以查看站點性能。

我發現了一些可以大大提高性能的東西。 不同頁面上站點的時間戳類似於使用 MAMP 的裸機配置。

我使用了如下解釋的音量優化: https : //engageinteractive.co.uk/blog/making-docker-faster-on-mac

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM