Magento 2.2.3 – Snabbare

I den här guiden ska vi få upp hastigheten på en lokalt installerad Magento 2.2.3 som installerats med MySQL, Apache2, PHP 7.0 på en Ubuntu 16.04 LTS.
https://charzam.com/2018/04/29/magento-2-2-3-installation/
Målet är att få ett snabbare utveckligssystem lokalt. Några av tipsen nedan kan även användas i en skarp miljö.

Magentokommandot

Du kommer att behöva köra magentokommandot ganska många gånger.
Gå in i magentokatalogen och skriv:

sudo php bin/magento

Om du vill ha det lite smidigare kan du göra så här:
Gå in i magentokatalogen/bin och skriv pwd för att få den fulla sökvägen hit.
Jag har: /home/peter/sites/m2/bin

nano /home/peter/.bashrc
export PATH=$PATH:/home/peter/sites/m2/bin
chmod 755 /home/peter/sites/m2/bin/magento

Stäng terminalen och öppna den på nytt för att .profile ska läsas in.
Nu ska du kunna skriva magento från valfri plats.

Jag fick ett felmeddelande ”cache_dir ”/home/peter/sites/m2/var/page_cache” is not writable”.

sudo chmod -R 777 /home/peter/sites/m2/var/

Sedan fungerade Magento 2.

Rensa cache

Du kommer att behöva rensa en massa cacher ganska ofta när du utvecklar med Magento 2. Kan vara bra att samla allt i en körbar bash-fil.

nano /home/peter/sites/m2/bin/aa

#!/bin/bash
sudo rm -rf /vagrant/src/magento2/var/di/*
sudo rm -rf /vagrant/src/magento2/var/generation/*
sudo rm -rf /vagrant/src/magento2/var/cache/*
sudo rm -rf /vagrant/src/magento2/var/page_cache/*
echo flushall | redis-cli
magento cache:flush
sudo service php7.0-fpm restart

Ge din fil exekveringsrättigheter:

chmod 755 /home/peter/sites/m2/bin/aa

Du kan nu skriva aa från valfri katalog och du får alla cacher rensade i Magento 2.
Du kanske får ett felmeddelande från redis-cli. Låt det vara. Vi kommer till redis lite senare.

Developer mode

I developer mode är saker lite smidigare medan du utvecklar, på bekostnad av hastighet. Rekommenderar developer mode i alla fall. Vi ska kolla på hastigheten senare.
https://charzam.com/2016/08/07/magento-2-1-mode/

magento deploy:mode:set developer

OP cache

När ett PHP script ska köras görs det om till byte-kod och körs sedan. OP cache lagrar undan byte-koden. Nästa gång samma script ska köras hämtar OP cache byte-koden så slipper PHP översätta scriptet till byte-kod. Det gör att PHP kör igång snabbare. Det här vill du ha över allt men inte på den mapp där du utvecklar din modul, för då måste du hela tiden rensa OP cache.
Kontrollera först att OP cache är aktivt i din phpinfo.
Du kan svartlista kataloger så de inte kommer med i OP cache.

sudo gedit /etc/php/opcache.blacklist

Min lista ser ut så här:

/home/peter/sites/m2/app/code/charzam/*
/home/peter/sites/m2/app/design/*
/home/peter/sites/m2/vendor/charzam/*
/home/peter/sites/m2/pub/*
/home/peter/sites/m2/index.php

Efter att du ändrat i listan behöver du starta om PHP

sudo service php7.0-fpm restart

Vhost

När du satte upp din domän att fungera med din Magento2 katalog så gick du nog rakt på root-katalogen där index.php ligger. Du kan med fördel använda pub/index.php istället, så ändra i din vhost så rooten är mot /pub

sudo gedit /etc/apache2/sites-enabled/000-default.conf

Starta om webbservern

sudo service apache2 restart

Glöm inte att rensa cache: aa
Refresha webbplatsen i webbläsaren.

PHP info

Det är alltid bra att ha en PHP info så du kan se vad som är installerat, inställningar, sökvägar till ini filer.
Skapa en fil i pub/phpinfo.php
Innehåll:

<?php
phpinfo();

Testa: http://local.m2.charzam/phpinfo.php

PHP

Kör phpinfo och se där var din php.ini fil finns.
Min är här: /etc/php/7.0/apache2/php.ini
Sök i phpinfo efter ”memory_limit”. Jag har 128Mb och vill öka det till 1Gb.

sudo gedit /etc/php/7.0/apache2/php.ini

Sök efter ”memory_limit”, ändra från 128M till 1024M.

Starta om PHP

sudo service php7.0-fpm restart

Kolla i phpinfo. Ditt minne bör nu vara local value: 768Mb, master value: 1024Mb
magento sätter sitt minne i pub/.user.ini till 768Mb. Du kan utöka det om du vill där.

MySQL

Din databasmotor behöver tilldelat minne i sina inställningar för att fungera bra.

sudo gedit /etc/mysql/my.cnf

Här inkluderar den bara alla filer från

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

MySQL Mer minne
Hur mycket minne har din MySQL tilldelat? Du kan se det genom att köra ett SQL kommando:

SHOW VARIABLES;

Eller en specifik variabel

SHOW VARIABLES where Variable_name = "innodb_buffer_pool_size";

Jag vill ha andra inställningar. Skapa en fil:

sudo gedit /etc/mysql/conf.d/magento2.cfg

och lägg detta i filen:

[mysqld]
innodb_buffer_pool_size=4096M
innodb_thread_concurrency=16
query_cache_size=1024M
query_cache_limit=64M

Starta om MySQL

sudo /etc/init.d/mysql start

MySQL Loggar

Du kan aktivera loggar
#general_log_file
#log_slow_queries
Loggen för långsamma sql frågor kan vara navändbar för att hitta flaskhalsar.

Redis cache

Redis är en minnesdatabas som lagrar data med key-value. Den är mycket snabb. Redis kan användas i Magento 2 för lagring av sessionsdata, block cache, full page cache.
Du kan läsa mer om Redis här: https://charzam.com/2016/08/11/redis/
Installera Redis

sudo apt-get install redis-server

Nu behöver du ändra i app/etc/env.php och lägga till följande:

'session' =>
    array(
        'save' => 'redis',
        'redis' =>
            array(
                'host' => '127.0.0.1',
                'port' => '6379',
                'database' => '0',
                'password' => '',
                'timeout' => '2.5',
                'persistent_identifier' => '',
                'compression_threshold' => '2048',
                'compression_library' => 'gzip',
                'log_level' => '1',
                'max_concurrency' => '6',
                'break_after_frontend' => '5',
                'break_after_adminhtml' => '30',
                'first_lifetime' => '600',
                'bot_first_lifetime' => '60',
                'bot_lifetime' => '7200',
                'disable_locking' => '0',
                'min_lifetime' => '60',
                'max_lifetime' => '2592000',
            ),
    ),
'cache' =>
    array(
        'frontend' =>
            array(
                'default' =>
                    array(
                        'backend' => 'Cm_Cache_Backend_Redis',
                        'backend_options' =>
                            array(
                                'server' => '127.0.0.1',
                                'port' => '6379',
                                'database' => '1',
                            ),
                    ),
                'page_cache' =>
                    array(
                        'backend' => 'Cm_Cache_Backend_Redis',
                        'backend_options' =>
                            array(
                                'server' => '127.0.0.1',
                                'port' => '6379',
                                'database' => '2',
                                'compress_data' => '0',
                            ),
                    ),
            ),
    ),

Det finns redan en sektion som ser ut så här:

'session' =>
 array(
 'save' => 'files',
 ),

Ta bort den.

Töm cachen med cc och läs om sidan.
Kontrollera nu i redis om det finns några nycklar där. Se hur man gör här:
https://charzam.com/2016/08/11/redis/

redis-cli
keys *
select 1
keys *
select 2
keys *
exit

Rättighetsproblem

Om du får problem med att Magento 2 inte kan skapa alla filer som behövs, försök då att sätta ägaren till www-data. Gå in i magento rootkatalogen och skriv;

sudo chown -R www-data:www-data *
sudo chmod -R 777 *

Admin inställningar

Alla systeminställningar finns här:
Admin >> Stores >> Configuration
Gå in där och ställ in följande:
Catalog >> Cataglog >> Storefront >>
”Use Flat Catalog Category” = Ja
”Use Flat Catalog Product” = Ja
Gå in i Admin >> System >> Cache management. Kontrollera att ALLA cacher är påslagna.
Kör:

magento indexer:reindex

Rensa cache i admin

Admin >> System >> cache management har två knappar.
”Flush cache storage” – Den rensar kopplade cacheservrar (Redis) ordentligt. Precis som kommandot aa gör.
”Flush Magento cache” – Den rensar den här Magento2 installationens keys i Redis. En lite lättare rensning som inte påverkar andra Magento2 servrar som använder samma Redis.
När du utvecklar kan du med fördel använda aa kommandot.

Cron

I Linux finns crontab -e som du kan använda för att kunna redigera crontab i Linux. Crontab är en schemaläggare för att köra program. Kör crontab -e och lägg till dessa rader:

* * * * * /home/peter/sites/m2/bin/magento cron:run --group="default" >> /home/peter/sites/m2/var/log/cron-default.log 2>&1
* * * * * /home/peter/sites/m2/bin/magento cron:run --group="index" >> /home/peter/sites/m2/var/log/cron-index.log 2>&1

Nu kan du titta i var/log ifall det finns fler loggfiler, då ser du om cron körts.
Du kan också titta i databastabellen ”cron_schedule” om Magento2 har fyllt på med data där, i så fall fungerar cron.

Slutligen

Nu är webbplatsen ganska rapp. Mycket tack vare Redis.
Jag avslutar guiden här men om du vill börja utveckla i Magento 2 kan jag rekommendera att du nu ser till att du får igång xdebug i en editor som klarar xdebug.
https://charzam.com/2011/08/27/xdebug-installera/
https://charzam.com/2016/06/11/felsoka-xdebug/

CharZam