Testy deweloperskiej wersji PHP 5.7 NG

Cześć! Cieszę się, że mnie odwiedziłeś/aś. Zanim przejdziesz do artykułu chciałbym zwrocić Ci uwagę na to, że ten artykuł był pisany kilka lat temu (2014-07-19) miej więc proszę na uwadzę że rozwiązania i przemyślenia które tu znajdziesz nie muszą być aktualne. Niemniej jednak zachęcam do przeczytania.

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 :)

Dzięki za wizytę,
Mateusz Mazurek
Mateusz M.

Ostatnie wpisy

Podsumowanie: luty i marzec 2024

Ostatnio tygodnie były tak bardzo wypełnione, że nie udało mi się napisać nawet krótkiego podsumowanie. Więc dziś zbiorczo podsumuję luty… Read More

1 tydzień ago

Podsumowanie: styczeń 2024

Zapraszam na krótkie podsumowanie miesiąca. Książki W styczniu przeczytałem "Homo Deus: Historia jutra". Książka łudząco podoba do wcześniejszej książki tego… Read More

2 miesiące ago

Podsumowanie roku 2023

Cześć! Zapraszam na podsumowanie roku 2023. Książki Zacznijmy od książek. W tym roku cel 35 książek nie został osiągnięty. Niemniej… Read More

3 miesiące ago

Podsumowanie: grudzień 2023

Zapraszam na krótkie podsumowanie miesiąca. Książki W grudniu skończyłem czytać Mein Kampf. Nudna książka. Ciekawsze fragmenty można by było streścić… Read More

4 miesiące ago

Praca zdalna – co z nią dalej?

Cześć, ostatnio w Internecie pojawiło się dużo artykułów, które nie były przychylne pracy zdalnej. Z drugiej strony większość komentarzy pod… Read More

4 miesiące ago

Podsumowanie: listopad 2023

Zapraszam na krótkie podsumowanie miesiąca. Książki W listopadzie dokończyłem cykl "Z mgły zrodzony" Sandersona. Tylko "Stop prawa" mi nie do… Read More

5 miesięcy ago