雖遲但到! PHP8測評來了~
6月25號php 8 alpha 1發布,7月9號 php 8 alpha 2發布,一般alpha 2是稍微能用的版本,所以週末測評了一下php8 JIT到底是個什麼?
先看一下結果:
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表現如何?
為了接近我們的業務,所以在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:BA1A37D8-760E-4637-901B -3E3521F969E7-4107-0000191504DD1B2E/86D37899-3B46-4BDA-B396-E5C8DD51068E.png]

倍。 但有一個問題我覺得很神奇php8無JIT計算少的情況居然也優化了很多,我以為是測試方向的問題,但是經過多次論證,這個數據是準確的,有時間想找一下這裡的最佳化點是什麼。
編譯過程
吐槽:php手動編譯越來越麻煩了,編譯了2個小時才編譯完,踩了N個坑,為了讓大家多寫幾個需求,把坑分享出來
環境
aliyun centos 6.9,咱們公司通常都是這個版本。
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复制代码
這裡通常都是makefile產生失敗的,後面有產生失敗的例子,產生成功後
make -j 8 make install cp php.ini-production /yourdir/php8/etc/php.ini
設定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失敗解決方法
這裡解決./configure 失敗的一些問題
問題一
No package 'sqlite3' found
解決方法
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"复制代码
注意
直接這樣是不行的,yum倉庫裡的版本太低。
yum install sqlite-devel
問題二
configure: error: Please reinstall the iconv library.
解決方法
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
解決方法
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
解決方法
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 !
#
以上是雖遲但到! PHP8測評來了~的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

php5和php8的差異在效能、語言結構、型別系統、錯誤處理、非同步程式設計、標準函式庫函數和安全性等方面。詳細介紹:1、效能提升,PHP8相對於PHP5來說在效能方面有了巨大的提升,PHP8引入了JIT編譯器,可以對一些高頻執行的程式碼進行編譯和最佳化,從而提高運行速度;2、語言結構改進,PHP8引入了一些新的語言結構和功能,PHP8支援命名參數,允許開發者透過參數名稱而不是參數順序等等。

php8加mysql擴充的步驟有:1.安裝MySQL客戶端函式庫;2、安裝PHP 8的開發工具;3、下載MySQL擴充原始碼;4、編譯和安裝MySQL擴充;5、啟用MySQL擴充;6、重啟Web伺服器即可。

本文為大家介紹如何安裝apache2.4,以及如何設定php8.0,文中附有圖文詳細步驟,以下就帶大家一起看看怎麼安裝設定apache2.4+php8.0吧~

PHP8可以使用mysqli和PDO來連接資料庫。詳細介紹:1、使用mysqli連接資料庫,透過傳入資料庫伺服器名稱、使用者名稱、密碼和資料庫名稱來連線。然後,使用`connect_error`屬性來檢查連線是否成功,如果連線失敗,則輸出錯誤訊息。最後,透過呼叫`close()`方法關閉連線;2、使用PDO連線資料庫,透過傳入資料庫伺服器名稱、密碼和資料庫名稱來進行連線等等。

php8資料型別的方法有字串轉換為整數、整數轉換為字串、字串轉換為浮點數、浮點數轉換為字串、陣列轉換為字串、字串轉換為陣列、布林值轉換為整數、整數轉換為布林值和變數類型判斷和轉換。詳細介紹:1、字串轉換為整數包括intval()函數和(int)強制型別轉換;2、整數轉換為字串包括strval()函數和(string)強制型別轉換;3、字串轉換為浮點數等等。

php8提高的效能包括:1、JIT編譯器的引進;2、函數呼叫的最佳化;3、垃圾回收機制的改進;4、型別系統的改良;5、新的語言特性;6、最佳化字串處理; 7.改進數組處理;8、引入新的記憶體管理機制;9、最佳化程式碼產生。詳細介紹:1、JIT編譯器的引入,PHP8引入了JIT編譯器,這是一種動態編譯技術,能夠將PHP程式碼轉換為機器碼,以便更有效率地執行;2、函數呼叫的最佳化等等。

php8的特性:1、JIT編譯器;2、命名參數;3、聯合型別;4、註解;5、建構子屬性提升;6、match表達式;7、nullsafe運算子;8、改進型別系統;9 、錯誤處理改進;10、一致性改進。詳細介紹:1、JIT編譯器,PHP8引入了即時編譯技術,將PHP程式碼編譯成本機機器碼,從而提高程式的執行速度;2、命名參數,PHP8支援命名參數,允許在函數呼叫時使用參數名稱等等。
