Ostatnio obiło mi się o uszy że trwają pracę na nową wersją PHP oznaczoną jako NG, czyli New Generation. Nowa generacja to przede wszystkim radykalna różnica w szybkości pomiędzy starymi wersjami a wcześniej wspomnianą, nową, wersją. Zaciekawiony tematem postanowiłem sprawdzić jak to wygląda na prawdę.
Postawiłem sobie wirtualkę z Ubuntu 12.04 i przystąpiłem do kompilacji źródeł PHP NG.
Pierw potrzebny jest git, czyli wstukujemy
1 | sudo apt-get install git-core |
tworzymy folder o nazwie tmp i klonujemy sobie repozytorium:
1 2 3 4 | git clone https://git.php.net/repository/php-src.git cd php-src git branch phpng origin/phpng git checkout phpng |
Ściągniemy tymi komendami źródła PHP. Następnie budujemy konfigurację
1 | ./buildconf |
i zlecamy skonfigurowanie się
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | ./configure \ --prefix=$HOME/tmp/usr \ --with-config-file-path=$HOME/tmp/usr/etc \ --enable-mbstring \ --enable-zip \ --enable-bcmath \ --enable-pcntl \ --enable-ftp \ --enable-exif \ --enable-calendar \ --enable-sysvmsg \ --enable-sysvsem \ --enable-sysvshm \ --enable-wddx \ --with-curl \ --with-mcrypt \ --with-iconv \ --with-gmp \ --with-pspell \ --with-gd \ --with-jpeg-dir=/usr \ --with-png-dir=/usr \ --with-zlib-dir=/usr \ --with-xpm-dir=/usr \ --with-freetype-dir=/usr \ --with-t1lib=/usr \ --enable-gd-native-ttf \ --enable-gd-jis-conv \ --with-openssl \ --with-mysql=/usr \ --with-pdo-mysql=/usr \ --with-gettext=/usr \ --with-zlib=/usr \ --with-bz2=/usr \ --with-recode=/usr \ --with-mysqli=/usr/bin/mysql_config |
Podczas tego procesu miałem mnóstwo błędów, ale wszystkie były spowodowane brakiem deweloperskich wersji bibliotek i rozwiązanie każdego problemu znalazłem na 1 stronie w Google, gdy wpisałem komunikat błędu. Gdy uporamy się z tym wpisujemy
1 | make |
a następnie
1 | make install |
Gdy się to wykona tworzymy katalog:
1 | mkdir $HOME/tmp/usr/etc |
a w nim plik
1 | sudo touch $HOME/tmp/usr/etc/php.ini |
i otwieramy go ulubionym edytorem po czym umieszczamy w nim konfiguracje PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | max_execution_time=600 memory_limit=128M error_reporting=0 display_errors=0 log_errors=0 user_ini.filename= realpath_cache_size=2M cgi.check_shebang_line=0 zend_extension=opcache.so opcache.enable_cli=1 opcache.save_comments=0 opcache.fast_shutdown=1 opcache.validate_timestamps=1 opcache.revalidate_freq=60 opcache.use_cwd=1 opcache.max_accelerated_files=100000 opcache.max_wasted_percentage=5 opcache.memory_consumption=128 opcache.consistency_checks=0 |
I na koniec weryfikujemy całość, wklepując:
1 | sapi/cli/php -v |
i modląc się żeby otrzymać w wyniku coś podobnego do:
1 2 3 4 | PHP 5.7.0-dev (cli) (built: Apr 28 2014 11:13:04) Copyright (c) 1997-2014 The PHP Group Zend Engine v2.7.0-dev, Copyright (c) 1998-2014 Zend Technologies with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies |
Jeszcze dodam – 512MB pamięci na wirtuace to było za mało dla poprawnej kompilacji PHP.
Poza PHP NG zainstalowałem także PHP 5.3 aby móc pokazać jak to jest z tą szybkością.
Zacznijmy od prostego skryptu:
1 2 3 4 5 | <?php for($i=0;$i<1000000;$i++) {} ?> |
Oto jakie czasowe wyniki zaprezentował PHP w werji 5.3
1 2 3 4 5 6 7 8 9 | root@ubuntu:~/tmp/php-src# /usr/bin/php5-cgi -T 1 t1.php > /dev/null Elapsed time: 0.055548 sec root@ubuntu:~/tmp/php-src# /usr/bin/php5-cgi -T 1 t1.php > /dev/null Elapsed time: 0.055730 sec root@ubuntu:~/tmp/php-src# /usr/bin/php5-cgi -T 1 t1.php > /dev/null Elapsed time: 0.064851 sec |
No i wyniki dla tego samego skryptu ale dla PHP NG:
1 2 3 4 5 6 7 8 9 | root@ubuntu:~/tmp/php-src# sapi/cgi/php-cgi -T 1 t1.php > /dev/null Elapsed time: 0.018371 sec root@ubuntu:~/tmp/php-src# sapi/cgi/php-cgi -T 1 t1.php > /dev/null Elapsed time: 0.020443 sec root@ubuntu:~/tmp/php-src# sapi/cgi/php-cgi -T 1 t1.php > /dev/null Elapsed time: 0.018044 sec |
No ok.. Faktycznie sporo szybciej. Ale spróbujmy inny skrypt, może taki:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $n=100000; for($i=0;$i<$n+1;$i++) $d[$i]=$i; for($a=2;$a<=$n+1;$a++) { for ($b=2*$a;$b<=$n+1;$b=$b+$a) { $d[$b]=0; } } ?> |
Czyli testujemy szybkość Sitem Eratostenesa ;)
Dla PHP 5.3:
1 2 3 4 5 6 7 8 9 | root@ubuntu:~/tmp/php-src# /usr/bin/php5-cgi -T 1 t2.php > /dev/null Elapsed time: 0.287300 sec root@ubuntu:~/tmp/php-src# /usr/bin/php5-cgi -T 1 t2.php > /dev/null Elapsed time: 0.335140 sec root@ubuntu:~/tmp/php-src# /usr/bin/php5-cgi -T 1 t2.php > /dev/null Elapsed time: 0.279990 sec |
No i to samo dla PHP NG:
1 2 3 4 5 6 7 8 9 | root@ubuntu:~/tmp/php-src# sapi/cgi/php-cgi -T 1 t2.php > /dev/null Elapsed time: 0.094711 sec root@ubuntu:~/tmp/php-src# sapi/cgi/php-cgi -T 1 t2.php > /dev/null Elapsed time: 0.103434 sec root@ubuntu:~/tmp/php-src# sapi/cgi/php-cgi -T 1 t2.php > /dev/null Elapsed time: 0.083793 sec |
Również sporo szybciej ;) Spróbujmy teraz wykonać ten 2 skrypt 100 razy i porównajmy wyniki
PSP 5.3:
1 2 3 | root@ubuntu:~/tmp/php-src# /usr/bin/php5-cgi -T 100 t2.php > /dev/null Elapsed time: 31.618812 sec |
Mnóstwo czasu. Teraz PHP NG:
1 2 3 | root@ubuntu:~/tmp/php-src# sapi/cgi/php-cgi -T 100 t2.php > /dev/null Elapsed time: 8.965470 sec |
Zróbmy jeszcze jeden test. Dla sortowania bąbelkowego – algorytm. Uruchommy to 10 razy.
Oto wyniki:
1 2 3 | root@ubuntu:~/tmp/php-src# /usr/bin/php5-cgi -T 10 t3.php > /dev/null Elapsed time: 0.003565 sec |
1 2 3 | root@ubuntu:~/tmp/php-src# sapi/cgi/php-cgi -T 10 t3.php > /dev/null Elapsed time: 0.001543 sec |
Jak widać w każdym teście PHP NG jest trochę lub dużo szybszy.
Trzymam kciuki za tę gałąź projektu, rozwijanie jej może wskrzesić PHP jako język skryptowy. Jest to też szansa dla dzielonych hostingów na znaczące zmniejszenie obciążenia maszyn a co za tym idzie, cięcie kosztów :)
Mateusz Mazurek