Home  >  Article  >  Backend Development  >  Late but arrived! PHP8 review is here~

Late but arrived! PHP8 review is here~

藏色散人
藏色散人forward
2020-09-16 16:51:118230browse

PHP 8 alpha 1 was released on June 25th, and php 8 alpha 2 was released on July 9th. Generally, alpha 2 is a slightly usable version, so I evaluated it over the weekend. What is the php8 JIT?

Let’s take a look at the results first:

When JIT is not turned on

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

When JIT is turned on:

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

There are also cases where Opcache is not turned on Next:

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

Do not enable Opcache: 2.299s When Opcache is enabled but JIT is not enabled: 1.419s When Opcache is turned on and JIT is turned on: 0.155s

With JIT turned on, it is close to 9.15 times that without JIT turned on. After multiple tests, this value is stable between 8 times and 10 times.

How does MPF perform?

In order to be close to our business, we test under the mpf framework

Environment

aliyun centos 6.9

php7.test.com php-fpm one process php8.test.com php-fpm one process

Mpf two 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);
}

Let’s do a stress test

php7 When there is less calculation

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 When there is too much calculation

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 When JIT is enabled and when there is less calculation

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 is turned on for many calculations

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 is turned off for less calculations

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 is turned off for many calculations

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]

Late but arrived! PHP8 review is here~
##It was found that php8JIT has the best performance of php7 when there is less calculation.

13 times, and the more calculations, the more obvious the optimization. When there are many calculations, php8JIT is 25.7 times the performance of php7.

But there is one problem that I think is amazing. PHP8 has been optimized a lot without JIT and has less calculations. I thought it was a problem with the test direction, but after many demonstrations, this data is accurate. I have time to think about it. Find out what the optimization points are here.

Compilation process

Tucao: Manual compilation of PHP is getting more and more troublesome. It took 2 hours to compile and stepped on N pitfalls. In order to let everyone write more requirements, I put Share the pit

Environment

aliyun centos 6.9, our company generally uses this version.

php source code compilation

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复制代码

Generally, the makefile generation fails here. There are examples of failed generation later. After the generation is successful,

make -j 8

make install

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

Remember to write down the old configuration of opcache.ini. In the final analysis, JIT is still an optimization of 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
Configure failure solution

Here are some problems with ./configure failure

Problem 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"复制代码
Note

This is not possible because the version in the yum warehouse is too low.

yum install sqlite-devel
Problem 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
Problem 3

No package 'oniguruma' found

Similarly, yum also does not work, the version is too low.

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"
Problem Four

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"复制代码
Enjoy php 8 & JIT !


The above is the detailed content of Late but arrived! PHP8 review is here~. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:juejin.im. If there is any infringement, please contact admin@php.cn delete