Przyspieszanie strony internetowej

Poniżej moje notatki sporządzone podczas optymalizacji wydajności portalu internetowego zbudowanego w oparciu o PHP 7.1, Symfony 3/4, AWS Elastic Beanstalk.

Zastosowanie się do nich pozwala znacząco zwiększyć szybkość wczytywania strony oraz zmniejszyć koszty utrzymania usługi.

  1. Zbadać stronę przy pomocy PageSpeed Insight i postarać się zastosować do podpowiedzi – niektóre zawarte w następnych punktach.
  2. Zbadać stronę przy pomocy Google Chrome DevTool – Audit (Lighthouse).
  3. Zbadać stronę przy pomocy Google Chrome DevTool – Network
  4. Szukać wąskiego gardła przy pomocy narzędzi jak NewRelic, Blackfire czy choćby Symfony WebProfiler, Xdebug.
  5. Użyć szybkiego “reverse proxy” typu Varnish czy na początek choćby Symfony HTTP Cache
  6. Włączyć obsługę HTTP/2
    Warto pamiętać, że aby skorzystać z HTTP/2 większość przeglądarek wymaga aby strona była zabezpieczona SSL-em.
    Dla projektów uruchamianych przy pomocy AWS Elastic Beanstalk zazwyczaj wystarczy użyć Application Load Balancer zamiast domyślnego Classic Load Balancer.
    W przypadku PHP trzeba również użyć PHP-FPM zamiast mod_php.
  7. Użyć “Preload” dla podstawowych plików ze stylami i JS.
  8. Użyć mod_expires aby ustawić nagłówki, kiedy ma wygasać w przeglądarce cache dla statycznych plików.
    <IfModule mod_expires.c>
    # Try cache static files
    ExpiresActive On
    ExpiresByType image/gif "access plus 1 months"
    ExpiresByType image/jpg "access plus 1 months"
    ExpiresByType image/jpeg "access plus 1 months"
    ExpiresByType image/png "access plus 1 months"
    ExpiresByType text/javascript "access plus 1 months"
    ExpiresByType application/javascript "access plus 1 months"
    ExpiresByType text/css "access plus 1 months"
    </IfModule>
  9. Włączyć kompresję gzip np. przy pomocy mod_deflate. Przynajmniej dla statycznych plików.
    <IfModule mod_deflate.c>
    # Enable gzip compression for static files
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
    </IfModule>
  10. Użyć szybkiego i skalowalnego CDN-a jak np. CloudFront
  11. Zmienić ustawienia PHP, np. dla projektu opartego na Symfony (3/4) i uruchamianego na PHP 7.1:
    apc.enable_cli = 1
    apc.shm_size = 64M
    opcache.enable_cli = On
    opcache.memory_consumption = 256
    opcache.max_accelerated_files = 100000
    opcache.fast_shutdown = 1
    opcache.validate_timestamps = 0 # disable for development
    realpath_cache_size = 4096k
    realpath_cache_ttl = 600
  12. Zoptymalizować użycie Composera
    composer install --no-dev
    composer dump-autoload --optimize --apcu
  13. Dodać indeksy w bazie danych (dotyczy SQL i NoSQL)
  14. Ograniczać liczbę i złożoność zapytań do bazy danych (dotyczy SQL i NoSQL)
  15. Długie zadania wykonywać na osobnym środowisku, np. AWS EB Worker Environment
  16. Starać się unikać “hydration” wykonywanego przez ORM – dla operacji na dużej ilości wierszy/obiektów.
  17. Starać się unikać skomplikowanej serializacji/deserializacji danych wykonywanej np. JMSSerializer

…