/Cài docker desktop chạy Laravel bị chậm và cách xử lý

Cài docker desktop chạy Laravel bị chậm và cách xử lý

Tình trạng chung là khi truy cập 1 link từ ứng dụng chạy Laravel trên docker desktop thì thời gian phản hồi từ server về là rất lâu.

Trước hết ta hiểu Docker desktop là một công cụ dành cho máy MacOS và Windows để xây dựng và chia sẻ các ứng dụng và dịch vụ được đóng gói.

Để thuận tiện cho việc development, chúng ta thường không copy source code vào wsl2 mà sẽ sử dụng volumes trên docker-compose.

Khi 1 ứng dụng laravel khởi chạy, sẽ cần load các thư viện trong vendor lên, do lượng file trong vendor không phải nhỏ nên chính việc này gây nên việc website bị chậm.

Ý tưởng là làm thế nào để mỗi lần khởi chạy ứng dụng không cần load lại những thư viện không có sự thay đổi thường xuyên.

Giải pháp là xử dụng opcache extension. Opcache sẽ cache toàn bộ nội dung của những file có đuôi .php ngoại trừ những file trong backlist

Thêm opcache vào php-fpm docker file

Thêm lệnh sau vào docker file

RUN apt-get update && apt-get install opcache -y; \
apt-get -y --no-install-recommends install \
git \
php8.1-intl \ 
php8.1-memcache \ 
php8.1-memcached \ 
php8.1-redis \ 
php8.1-gd \
php8.1-mysql;

Khai báo opcache trong docker-compose

volumes:
    - ../project/:/var/www/html:cached
    - ./php-fpm/opcache-blacklist.txt:/etc/php/8.1/fpm/opcache-blacklist.txt
    - ./php-fpm/10-opcache.ini:/etc/php/8.1/fpm/conf.d/10-opcache.ini

Cấu hình opcache

Nội dung cấu hình trong file 10-opcache.ini

; configuration for php opcache module
; priority=10
zend_extension=opcache.so
[opcache]
opcache.enable=1
; 0 means it will check on every request
; 0 is irrelevant if opcache.validate_timestamps=0 which is desirable in production
opcache.revalidate_freq=0
opcache.validate_timestamps=0
opcache.max_accelerated_files=32531
opcache.memory_consumption=512
opcache.max_wasted_percentage=10
opcache.interned_strings_buffer=64
opcache.fast_shutdown=1
opcache.blacklist_filename=/etc/php/8.1/fpm/opcache-blacklist.txt

Trong đó tham số blacklist_filename để khai báo đường dẫn tới file lưu thông tin những đường dẫn bị exclude (không cache – Cần thiết cho môi trường development vì không mất công clear cache mỗi khi debug)

Clear cache

Có thể clear cache bằng cách restart php-fpm hoặc chạy php script sau

<?php
opcache_reset();
?>