Mateusz Mazurek – programista z pasją

Python, architektura, ciekawostki ze świata IT

Linux Programowanie Programowanie webowe

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

A może wolisz nowości na mail?

Subskrybuj
Powiadom o
guest

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

0 komentarzy
Inline Feedbacks
View all comments