Post

Proste sztuczki w kodzie potrafią przyspieszyć kod

Wstęp

Tutoriali, poradników i innych opisów jak programować w jakimkolwiek języku jest mnóstwo. Jednak niewiele zwraca uwagę na pozornie banalne rzeczy, a które potrafią bardzo spowolnić Twój kod. Stąd właśnie pomysł, aby podzielić się ze światem swoimi spostrzeżeniami, błędami (swoimi oraz cudzymi) oraz pomysłami co zrobić, aby wyeliminować wąskie gardła w kodzie. Na codzień programuję w PHP, jednak pomysły przeze mnie przedstawione można zastosować w jakimkolwiek języku. Dlaczego? Dlatego, że to co chcę Wam przedstawić nie odnosi się do konkretnych funkcji czy klas, a samej logiki, która przeważnie jest bardzo podobna w wielu językach.

Środowisko testowe

Wszystkie testy będą przeprowadzane na tej samej platformie testowej. Na chwilę obecną jest to serwer "stojący" we francuskiej serwerowni. Konfiguracja sprzętowa:

  • procesor: Intel Atom N2800 1.86 GHz
  • pamięć RAM: 2 GB
  • dysk: HDD 500 GB

Na serwerze został zainstalowany system Debian w najnowszej wersji stabilnej - 9.1 (stretch). Domyślną wersja interpretatora PHP dla tej wersji Debiana jest 7.0 (dokładnie 7.0.19 na dzień dzisiejszy), dodatkowo ręcznie skompilowałem wersję 5.6.31 na potrzeby testów (opis kompilacji będzie w dalszej części). Przyda nam się również baza danych - domyślna dla Stretcha - MariaDB w wersji 10.1.26.

Przygotowanie środowiska

Aktualizujemy pakiety:

apt-get update
apt-get upgrade -y
apt-get autoremove

Instalujemy PHP i serwer MySQL (oraz wszystkie zależności):

apt-get install php-cli mariadb-server

Sprawdzamy PHP:

php -v

powinno zwrócić:

PHP 7.0.19-1 (cli) (built: May 11 2017 14:04:47) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.0.19-1, Copyright (c) 1999-2017, by Zend Technologies

Zmieniamy hasło do serwera bazodanowego ([HASLO] zastąp swoim hasłem):

mysqladmin -u root password [HASLO]

Logujemy się do MySQL-a (z nowym hasłem):

mysql -u root -p -h localhost

Jeśli widzimy znak zachęty MySQL-a to znaczy, że wszystko działa prawidłowo:

Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 22
Server version: 10.1.26-MariaDB-0+deb9u1 Debian 9.1

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Kompilacja PHP 5.6

Aby skompilować cokolwiek w Debianie musimy doinstalować na początek kilka paczek:

apt-get install build-essential checkinstall zip autoconf

Następnie kilka bibliotek potrzebnych do skompilowania PHP w wersji 5.6:

apt-get install libfcgi-dev libfcgi0ldbl libmcrypt-dev libssl-dev libc-client2007e-dev libkrb5-dev libxml2-dev libcurl4-openssl-dev libpcre3-dev libbz2-dev libjpeg-dev libpng-dev libfreetype6-dev libmcrypt-dev libmhash-dev freetds-dev libmariadbclient-dev-compat unixodbc-dev libxslt1-dev

W tym momencie możemy przygotować sobie źródła:

cd /opt
wget http://fr2.php.net/distributions/php-5.6.31.tar.gz
tar -zxvf php-5.6.31.tar.gz
cd php-5.6.31

Konfiguracja przed kompilacją:

./configure  --prefix=/usr/local/php-5.6.31 --with-zlib-dir --with-freetype-dir --enable-mbstring --with-libxml-dir=/usr --enable-calendar --with-mcrypt --with-zlib --with-gd --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-mbregex --with-mhash --enable-zip --with-pcre-regex --with-mysql --with-pdo-mysql --with-mysqli --with-jpeg-dir=/usr --with-png-dir=/usr --enable-gd-native-ttf --with-pear --enable-memcache --with-libdir=lib/x86_64-linux-gnu --with-config-file-path=/usr/local/php-5.6.31/etc --with-config-file-scan-dir=/usr/local/php-5.6.31/etc

Kompilacja:

make install

Po dłuższej chwili powinniśmy mieć gotowe binarki. Całość powinna być w folderze:

/usr/local/php-5.6.31

Aby ułatwić pracę z PHP 5.6 stworzymy symlinka:

ln -s /usr/local/php-5.6.31/bin/php /usr/bin/php5

Dodatkowo należy stworzyć domyślną konfigurację (najlepiej pobrać na początek domyślną dla wybranej wersji) i utworzyć ją tutaj:

/usr/local/php-5.6.31/etc/php.ini

Po tych zabiegach sprawdźmy czy wszystko działa prawidłowo:

php5 -v

powinno zwrócić:

PHP 5.6.31 (cli) (built: Sep  8 2017 11:13:26)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

Dla jasności dodałem również symlink na domyślna wersję PHP, tak aby nie było niejasności:

ln -s /usr/bin/php /usr/bin/php7

W ten oto sposób komenda php5 uruchamia interpreter w wersji 5.6.31 a komenda php7 w wersji 7.0.19.

Repozytorium i baza danych

Środowisko mamy przygotowane - czas na repozytorium z testami. Na początek potrzebujemy git-a:

apt-get install git

Klonujemy repozytorium:

git clone https://gitlab.cpux.pl/createanduse/php-performance

W projekcie znajduje się folder sql, w którym znajdują zaptania do bazy danych, które należy wykonać przed uruchomieniem testów. Najpierw przygotujemy jednak nowa bazę danych:

mysql -u root -p -h localhost
MariaDB [(none)]> CREATE DATABASE performance;

Opcjonalnie tworzymy nowego użytkownika:

MariaDB [(none)]> CREATE USER performance@localhost IDENTIFIED BY 'performance';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON performance.* TO performance@localhost;
MariaDB [(none)]> FLUSH PRIVILEGES;

Właśnie utworzyliśmy bazę danych o nazwie performance oraz użytkownika o nazwie performance i takim samym hasłem. Przełączamy się na nowo utworzoną bazę:

MariaDB [(none)]> USE performance;
MariaDB[performance]> source [/path/to/project]/inc/[plik].sql

gdzie [/path/to/project] oraz [plik] zastępujemy odpowiednio ścieżką do projektu oraz nazwą pliku sql z projektu.

Podsumowanie

W tym momencie mamy gotowe środowisko testowe. W kolejnych postach szczegółowo opiszę testy, oraz logikę, która pomimo niewielkich różnic potrafi przyspieszyć wykonywanie kodu od kilkunastu do nawet kilkuset procent.


Przejdź do strony głównej


Komentarze

Brak komentarzy

Dodaj komentarz







© 2017 Łukasz Gogołkiewicz. Wszelkie prawa zastrzeżone.