Maison >développement back-end >PHP8 >En retard mais arrivé ! La revue PHP8 est ici ~

En retard mais arrivé ! La revue PHP8 est ici ~

藏色散人
藏色散人avant
2020-09-16 16:51:118301parcourir

PHP 8 alpha 1 est sorti le 25 juin et php 8 alpha 2 est sorti le 9 juillet. Généralement, l'alpha 2 est une version légèrement utilisable, donc je l'ai évalué ce week-end.

Regardons d'abord les résultats :

Quand JIT n'est pas activé

php -d opcache.jit_buffer_size=0 Zend/bench.php
simple             0.025simplecall         0.012simpleucall        0.012simpleudcall       0.012mandel             0.135mandel2            0.211ackermann(7)       0.082ary(50000)         0.012ary2(50000)        0.010ary3(2000)         0.186fibo(30)           0.283hash1(50000)       0.039hash2(500)         0.041heapsort(20000)    0.089matrix(20)         0.110nestedloop(12)     0.096sieve(30)          0.045strcat(200000)     0.019------------------------
Total              1.419

Quand JIT est activé :

php -d -d opcache.jit_buffer_size=64M -d opcache.jit=1205 Zend/bench.php
simple             0.001simplecall         0.000simpleucall        0.000simpleudcall       0.000mandel             0.005mandel2            0.006ackermann(7)       0.010ary(50000)         0.005ary2(50000)        0.004ary3(2000)         0.011fibo(30)           0.027hash1(50000)       0.027hash2(500)         0.018heapsort(20000)    0.011matrix(20)         0.011nestedloop(12)     0.006sieve(30)          0.004strcat(200000)     0.009------------------------
Total              0.155

Il y a aussi un cas où Opcache n'est pas activé Suivant :

php Zend/bench.php
simple             0.051simplecall         0.017simpleucall        0.083simpleudcall       0.089mandel             0.506mandel2            0.409ackermann(7)       0.095ary(50000)         0.012ary2(50000)        0.010ary3(2000)         0.187fibo(30)           0.367hash1(50000)       0.040hash2(500)         0.041heapsort(20000)    0.097matrix(20)         0.122nestedloop(12)     0.093sieve(30)          0.063strcat(200000)     0.018------------------------
Total              2.299

Ne pas activer Opcache : 2,299 s Lorsqu'Opcache est activé mais que JIT n'est pas activé : 1,419 s Lorsque Opcache est activé et JIT est activé : 0,155 s

Lorsque JIT est activé, c'est près de 9,15 fois celui lorsque JIT n'est pas activé. Après plusieurs tests, cette valeur est stable entre 8 fois. et 10 fois.

Comment fonctionne MPF ?

Afin d'être proche de notre métier, nous avons testé sous le framework mpf

Environnement

aliyun centos 6.9

php7.test.com php- fpm un processus php8.test.com php-fpm un processus

Mpf deux interfaces

/v1/hello/wzh/index1

public function index1() {    $this->output('123');
}

/v1/hello/wzh/index2

public function index2() {
    $a = 0;    for ($i = 0; $i < 1000000; $i++)
        $a++;    $this->output($a);
}

Faisons un test de résistance

php7 Situation avec calcul faible

wrk -c36 -d 5s -t12 https://php7.test.com/v1/hello/wzh/index1
Running 5s test @ https://php7.test.com/v1/hello/wzh/index1
  12 threads and 36 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   432.97ms   76.00ms 527.38ms   92.17%
    Req/Sec     8.38      5.36    20.00     63.85%
  396 requests in 5.09s, 121.43KB readRequests/sec:     77.78
Transfer/sec:     23.85KB

php7 Situation avec calcul élevé

wrk -c36 -d 5s -t12 https://php7.test.com/v1/hello/wzh/index2
Running 5s test @ https://php7.test.com/v1/hello/wzh/index2
  12 threads and 36 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.02s   569.99ms   1.96s    57.14%
    Req/Sec     3.18      3.43    10.00     80.88%
  70 requests in 5.03s, 21.60KB read
  Socket errors: connect 0, read 0, write 0, timeout 42
Requests/sec:     13.91
Transfer/sec:      4.29KB

php8 Situation avec calcul faible lorsque JIT est activé

wrk -c36 -d 5s -t12 https://php8.test.com/v1/hello/wzh/index1
Running 5s test @ https://php8.test.com/v1/hello/wzh/index1
  12 threads and 36 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    34.48ms    4.34ms  95.45ms   87.87%
    Req/Sec    84.61     13.36   121.00     85.28%
  5083 requests in 5.03s, 1.67MB readRequests/sec:   1010.55
Transfer/sec:    340.43KB

php8 JIT est activé pour de nombreux calculs

wrk -c36 -d 5s -t12 https://php8.test.com/v1/hello/wzh/index2
Running 5s test @ https://php8.test.com/v1/hello/wzh/index2
  12 threads and 36 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    97.84ms    4.97ms 159.50ms   92.12%
    Req/Sec    30.27      4.42    50.00     86.50%
  1814 requests in 5.07s, 614.71KB readRequests/sec:    357.76
Transfer/sec:    121.23KB

php8 JIT est désactivé pour moins de calculs

wrk -c36 -d 5s -t12 https://php8.test.com/v1/hello/wzh/index1
Running 5s test @ https://php8.test.com/v1/hello/wzh/index1
  12 threads and 36 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    38.10ms    6.47ms 239.60ms   94.01%
    Req/Sec    77.50     12.76   110.00     89.63%
  4622 requests in 5.04s, 1.52MB readRequests/sec:    916.22
Transfer/sec:    308.65KB

php8 JIT est désactivé pour de nombreux calculs

wrk -c36 -d 5s -t12 https://php8.test.com/v1/hello/wzh/index2
Running 5s test @ https://php8.test.com/v1/hello/wzh/index2
  12 threads and 36 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   766.16ms  181.30ms 887.08ms   88.37%
    Req/Sec     6.25      5.36    20.00     91.36%
  215 requests in 5.09s, 72.86KB readRequests/sec:     42.22
Transfer/sec:     14.31KB

[ image:BA1A37D8-760E-4637-901B -3E3521F969E7-4107-0000191504DD1B2E/86D37899-3B46-4BDA-B396-E5C8DD51068E.png]

En retard mais arrivé ! La revue PHP8 est ici ~

Trouvé que php8J a de faibles calculs IT équivaut à 13 fois les performances de php7, et plus il y a de calculs, plus l'optimisation est évidente. Lorsqu'il y a beaucoup de calculs, php8JIT est 25.7 fois les performances de php7.

Mais il y a un problème que je trouve incroyable. PHP8 a beaucoup d'optimisations sans JIT et moins de calculs. Je pensais que c'était un problème avec la direction des tests, mais après de nombreuses démonstrations, ces données sont exactes. J'ai le temps d'y réfléchir. Découvrez quels sont les points d'optimisation ici.

Processus de compilation

Tucao : La compilation manuelle de PHP devient de plus en plus difficile. La compilation a pris 2 heures et a marché sur N pièges. Afin de permettre à tout le monde d'écrire plus d'exigences, partagez. la fosse

Environnement

aliyun centos 6.9, notre société utilise généralement cette version.

compilation du code source php

wget https://downloads.php.net/~carusogabriel/php-8.0.0alpha2.tar.gz

tar -zxf php-8.0.0alpha2.tar.gzcd php-8.0.0alpha2

./configure --prefix=/yourdir/php8 --with-config-file-path=/yourdir/php8/etc --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-fpm --enable-static --enable-sockets --with-zip --enable-calendar --enable-bcmath --enable-mbstring --with-zlib --with-iconv=/usr/local/libiconv --enable-gd --enable-mbstring --with-freetype --with-mysql-sock=/tmp/mysql.sock --disable-ipv6 --enable-debug --with-openssl --enable-opcache复制代码

Généralement, la génération du makefile échoue ici. Il existe des exemples d'échec de génération plus tard. Une fois la génération réussie,

make -j 8

make install

cp php.ini-production /yourdir/php8/etc/php.ini

Configurez php.ini.

N'oubliez pas de noter l'ancienne configuration d'opcache.ini En dernière analyse, JIT est toujours une optimisation d'Opcache.

zend_extension=opcache.so
opcache.enable=1

; 命令行测试的话这里一定要打开
opcache.enable_cli=1
opcache.memory_consumption=512
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.validate_timestamps=1
opcache.revalidate_freq=300
opcache.fast_shutdown=1
opcache.enable_file_override = 1
opcache.blacklist_filename = /etc/php.d/opcache.blacklist

; 这里就是新的jit的配置
opcache.jit=1205
opcache.jit_buffer_size=64M

Solution pour configurer l'échec

Voici quelques problèmes avec ./configure failed

Problème 1
No package 'sqlite3' found

Solution

wget https://www.sqlite.org/2020/sqlite-autoconf-3320300.tar.gz

tar -zxf sqlite-autoconf-3320300.tar.gzcd sqlite-autoconf-3320300

./configure --prefix=/usr/local/lib/sqlite-3.32.0

make CFLAGS="-g -O2 -DSQLITE_ENABLE_COLUMN_METADATA"make installexport PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/sqlite-3.32.0/lib/pkgconfig"复制代码

Remarque

Ce n'est pas possible car la version dans le dépôt yum est trop basse.

yum install sqlite-devel

Problème 2

configure: error: Please reinstall the iconv library.

Solution

wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz

tar -zxf libiconv-1.14.tar.gzcd libiconv-1.14

./configure 

make 

make install

Problème 3

No package 'oniguruma' found

De même, miam ne fonctionne pas non plus, la version est trop basse.

yum install oniguruma-devel

Solution

wget https://github.com/kkos/oniguruma/archive/v6.9.5_rev1.tar.gz

tar -zxf v6.9.5_rev1.tar.gzcd oniguruma-6.9.5_rev1/ 

autoreconf -vfi

./configure --prefix=/usr/local/lib/oniguruma-6.9.5

make 

make installexport PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/oniguruma-6.9.5/lib/pkgconfig"

Problème 4

No package 'libzip' found

Solution

wget https://libzip.org/download/libzip-1.7.2.tar.gz

tar -zxf libzip-1.7.2.tar.gzcd libzip-1.7.2

cmake3 -DCMAKE_INSTALL_PREFIX=/usr/local/lib/libzip-1.7.2

make 

make installexport PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/libzip-1.7.2/lib/pkgconfig"复制代码

Profitez de php 8 et JIT !


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Article précédent:Comprendre le JIT de PHP 8Article suivant:Comprendre le JIT de PHP 8