PHP 8 알파 1은 6월 25일에 출시되었고, PHP 8 알파 2는 7월 9일에 출시되었습니다. 일반적으로 알파 2는 약간 사용 가능한 버전이므로 주말 동안 평가해 보았습니다.
먼저 결과를 살펴보겠습니다:
JIT가 켜지지 않음
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
JIT가 켜져 있음:
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
그리고 Opcache가 켜지지 않음:
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
Opcache가 켜지지 않음: 2.299s Opcache가 활성화되었지만 JIT가 활성화되지 않은 경우: 1.419s Opcache를 켜고 JIT를 켠 경우: 0.155s
JIT를 켠 경우 JIT를 켠 경우보다 9.15배에 가깝습니다. 여러 번 테스트한 결과 이 값은 8배에서 10배 사이로 안정적입니다.
비즈니스에 더욱 가까워지기 위해 mpf 프레임워크
aliyun centos 6.9
php7.test.com php-fpm 프로세스에서 테스트했습니다. php8.test.com php-fpm 하나의 프로세스
Mpf 두 개의 인터페이스
/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); }
스트레스 테스트
php7 상황 계산이 적음
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 더 많은 계산
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 JIT는 더 적은 계산을 활성화합니다
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는 더 많은 계산을 활성화합니다
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는 더 적은 계산을 비활성화합니다
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는 많은 계산을 비활성화합니다
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:BA1A37D 8 -760E -4637-901B-3E3521F969E7-4107-0000191504DD1B2E/86D37899-3B46-4BDA-B396-E5C8DD51068E.png]
8JIT는 13
倍,而且计算越多优化越明显,计算多情况下php8JIT是php7性能的25.7
php7 성능의 2배.
하지만 제가 생각하는 놀라운 문제가 하나 있습니다. PHP8에는 JIT 없는 계산에 있어서 최적화가 많이 되어 있는데, 테스트 방향에 문제가 있는 줄 알았는데, 여러 번 시연을 해본 결과 이 데이터가 정확했습니다. 시간이 있으면 여기에서 찾아보고 싶습니다. 최적화 포인트는 무엇입니까?
불만: PHP 수동 컴파일이 점점 더 번거로워지고 있습니다. 컴파일하는 데 2시간이 걸렸고, 모두가 더 많은 요구 사항을 작성할 수 있도록 함정을 공유하겠습니다
aliyun centos 6.9, 저희 회사는 주로 이 버전을 사용합니다.
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复制代码
여기서 일반적으로 makefile 생성이 실패합니다. 생성이 성공한 후
make -j 8 make install cp php.ini-production /yourdir/php8/etc/php.ini
opcache의 이전 구성을 기록해 두세요. ini 에서 JIT는 여전히 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
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
이 작업을 직접 수행하면 작동하지 않습니다. yum Warehouse의 버전이 너무 낮습니다.
yum install sqlite-devel
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
No package 'oniguruma' found
마찬가지로 yum도 작동하지 않습니다. 버전이 너무 낮습니다.
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"
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"复制代码
PHP 8과 JIT를 즐겨보세요!
위 내용은 늦었지만 도착했어요! PHP8 리뷰가 왔습니다~의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!