Rumah pembangunan bahagian belakang PHP8 PHP 8新特性之JIT对PHP应用性能的影响

PHP 8新特性之JIT对PHP应用性能的影响

Oct 30, 2020 pm 04:25 PM

推荐:《PHP8教程

前言

即将发布的 PHP 8 最受大家关注的新特性就是引入了对 JIT 的支持,我已经简单介绍了 JIT 是什么,以及与 Opcache 的区别,这里简单总结下:

  • JIT 是在 Opcache 优化的基础上结合 Runtime 信息将字节码编译为机器码缓存起来
  • 现有的 Opcache 优化不受任何影响,并且 PHP 的 JIT 是在 Opcache 中提供的
  • JIT 不是对 Opcache 替代,而是增强,在启用 JIT 的情况下,如果 Zend 底层发现特定字节码已经编译为机器码,则可以绕过 Zend VM 直接让 CPU 执行机器码,从而提高代码性能。

看起来很高大上,不过 JIT 主要针对 CPU 密集型操作优化效果明显,而目前主流的 PHP Web 应用都是 IO 密集型操作,那么 PHP 8 引入的 JIT 对这些 Web 应用的性能有没有提升呢?为此,特地编译安装了 PHP 8 Alpha 版本,并分别对命令行应用(CPU 密集型操作)和 Laravel 应用(IO 密集型操作)进行了简单的基准测试来探个究竟。

准备一个 Ubuntu 虚拟机

注:PHP 的 JIT 只能在 X86 架构下生效,所以使用 Intel CPU 的 PC、Mac、Linux 环境均可支持。

由于目前 PHP 8 还没有正式发布,只能下载源代码编译安装,所以需要准备一个 Linux 环境作为测试环境。不少同学跟我反映没怎么在 Windows 上演示过操作流程,所以今天我特地选择在 Windows 10 专业版中通过 WSL 来安装 Ubuntu 18.04 作为演示环境,这个比通过 Virtual Box 或者 VMWare 安装虚拟机简单多了,不得不说,从 Windows 10 开始,对开发者越来越友好了,虽然比起 Mac 还是有些距离,毕竟 Mac 是原生的类 Unix 系统。

言归正传,安装 WSL 版 Ubuntu 虚拟机 Windows 官方提供了相应的文档:Windows Subsystem for Linux Installation Guide for Windows 10,照着做就好了,非常简单,在 Windows 商店下载安装后,就可以点击启动按钮启动这个 Ubuntu 虚拟机了:

打开后的界面是这样的,看起来和一个终端窗口差不多:

这个虚拟机使用起来的体验比传统的虚拟机要简单一些,比如直接可以调用 Windows 宿主机的程序,比如 VS Code,在虚拟机中通过 Nginx 管理的 Web 应用也可以直接从 Windows 宿主机的浏览器访问,无需配置端口映射,所以用来作为本地 Linux 测试开发环境很方便。

当然,如果你不想尝鲜的话,使用传统的虚拟机或者原生的 Ubuntu 系统都可以。

演示项目初始化

接下来,我们需要通过上面打开的终端窗口在这个 Ubuntu 虚拟机中安装 Nginx,以及 PHP、Composer,通过以下几个命令就可以搞定了:

sudo apt install nginx
sudo apt install php php-zip php-mbstring
sudo apt install composer
Salin selepas log masuk

然后通过 Composer 在 Nginx 默认 Web 根目录 /var/www 目录下安装用于演示的 Laravel Web 项目(下载速度慢可以配置 Composer 全局镜像):

sudo composer create-project --prefer-dist laravel/laravel blog 6.* -vvv
Salin selepas log masuk

初始化完成后,可以通过 php artisan serve 测试下这个项目访问是否正常。这里就不演示了。

编译安装 PHP 8 测试版

完成上述准备工作后,就可以开始 PHP 8 测试版本的编译安装了,首先,我们从 Github 下载 PHP 8 测试版本源码(PHP 官网源码包下载太慢):

wget https://github.com/php/php-src/archive/php-8.0.0alpha2.tar.gz
Salin selepas log masuk

解压并进入源码根目录:

tar zxvf php-8.0.0alpha2.tar.gz
cd php-8.0.0alpha2
Salin selepas log masuk

开始编译安装流程:

// 1、安装相关依赖库
sudo apt install -y pkg-config build-essential autoconf bison re2c libxml2-dev \
libsqlite3-dev libssl-dev libcurl4-openssl-dev libpng-dev libonig-dev libzip-dev

// 2、生成 configure 文件
./buildconf --force

// 3、配置构建流程
./configure --prefix=/usr/local/php8 \
--with-config-file-path=/usr/local/php8 \
--enable-mbstring  \
--enable-ftp  \
--enable-gd   \
--enable-mysqlnd \
--enable-pdo   \
--enable-sockets   \
--enable-fpm   \
--enable-xml  \
--enable-soap  \
--enable-pcntl   \
--enable-cli   \
--enable-json  \
--enable-tokenizer \
--enable-ctype \
--enable-bcmath  \
--with-openssl  \
--with-pear   \
--with-zlib  \
--with-iconv  \
--with-curl  \
--with-zip

// 4、构建
make

// 5、安装
sudo make install
Salin selepas log masuk

最后一步执行成功后,会有 PHP 8 安装成功的提示文本,你也可以通过如下命令验证安装成功:

当前 PHP 8 被安装到了 /usr/local/php8 这个目录下。

初始化配置文件

编译安装的 PHP 8 需要自行拷贝和设置配置文件,我们首先将基础配置文件 php.ini 从源代码目录拷贝到 PHP 的安装目录:

sudo cp php.ini-production /usr/local/php8/php.ini
Salin selepas log masuk

由于 JIT 是在 Opcache 扩展中提供的,所以需要先启动这个扩展,打开 /usr/local/php8/php.ini,取消对如下配置项的注释(删除前面的分号即可):

zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
Salin selepas log masuk

然后来初始化 PHP-FPM 的配置文件。

先把 php8.0-fpm 二进制文件拷贝到 /etc/init.d 目录下(还是在 php-8.0.0alpha2 源码目录下操作):

sudo cp sapi/fpm/init.d.php-fpm /etc/init.d/php8.0-fpm
sudo chmod +x /etc/init.d/php8.0-fpm
Salin selepas log masuk

进入 /usr/local/php8/etc 目录,初始化 PHP-FPM 配置文件:

cd /usr/local/php8/etc
sudo cp php-fpm.conf.default php-fpm.conf
Salin selepas log masuk

通过 vim 编辑器打开 php-fpm.conf,修改如下配置项(同时取消前面的分号注释):

pid = /run/php/php8.0-fpm.pid
Salin selepas log masuk

然后进入当前目录下的 php-fpm.d 子目录:

cd php-fpm.d
sudo cp www.conf.default www.conf
Salin selepas log masuk

打开 www.conf,修改如下配置项(同时取消前面的分号注释):

user = www-data
group = www-data

listen = /run/php/php8.0-fpm.sock

listen.owner = www-data
listen.group = www-data
listen.mode = 0660
Salin selepas log masuk

命令行应用基准测试

完成上述准备工作后,就可以正式开始测试工作了。

首先,我们来测试命令行应用,PHP 官方在源码中提供了一个基准测试文件,我们进入源码所在目录 php-8.0.0alpha2,通过如下命令测试不启动 JIT 情况下代码运行情况:

/usr/local/php8/bin/php -d opcache.jit_buffer_size=0 Zend/bench.php
Salin selepas log masuk

运行结果如下(运行时间,单位为 s):

然后,再通过下面这条命令测试启动 JIT 的情况下命令行代码的运行情况:

/usr/local/php8/bin/php -d opcache.jit_buffer_size=64M -d opcache.jit=1205 Zend/bench.php
Salin selepas log masuk

注:关于 opcache.jit_buffer_size 配置项比较好理解,而 opcache.jit 配置项对应配置值的每个数字代表不同含义,具体可以参考鸟哥的这篇博客:PHP 8 新特性之 JIT 简介,里面讲得非常详细,一般对于命令行应用,将该配置值配置为 1205,对于 Web 应用,配置为 1235 或者 1255。

最终运行结果如下:

可以看到,在 CPU 密集型操作的命令行应用中,启用 JIT 与不启用相比,耗时降低了接近 60%,性能提升了 2 倍

Web 应用基准测试

接下来,我们以 Laravel 演示项目为例,演示 PHP Web 应用中启用 JIT 与不启用性能有没有提升。

启动 PHP-FPM:

sudo /etc/init.d/php8.0-fpm start
Salin selepas log masuk

在 Nginx 中配置一个新的虚拟主机(/etc/nginx/sites-available/blog):

server {
    listen 80;
    server_name blog.test;
    root /var/www/blog/public;

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
Salin selepas log masuk

然后进入 /etc/nginx/sites-enable 目录,创建这个虚拟主机的软连接:

sudo ln -s /etc/nginx/sites-available/blog blog
Salin selepas log masuk

启动 Nginx:

sudo service nginx start
Salin selepas log masuk

在 Windows 系统的 C:\Windows\System32\drivers\etc\hosts 文件中添加虚拟域名与主机地址的映射:

127.0.0.1 blog.test
Salin selepas log masuk

此时可以在 Windows 宿主机中通过浏览器访问对应的 Laravel 项目,表示部署成功:

然后,我们还是在 Windows 中,通过 ab 命令对 blog.test 首页进行压力测试(此时尚未启用 JIT):

ab -n 10 -c 10 http://blog.test/
Salin selepas log masuk

注:-n 表示总请求数,-c 表示最大并发请求数。

测试结果如下,重点关注 RPS(每秒处理请求数):

-w995

最后,在 Ubuntu 虚拟机中,打开 PHP 8 的配置文件 /usr/local/php8/php.ini,在 Opcache 配置项下新增 JIT 配置:

opcache.jit=1235
opcache.jit_buffer_size=64M
Salin selepas log masuk

配置完成后,重启 PHP-FPM 服务,再次回到 Windows 宿主机,通过 ab 命令对 http://blog.test 页面进行压力测试:

ab -n 10 -c 10 -s 60 http://blog.test/
Salin selepas log masuk

注:-s 表示超时时间。

运行结果如下:

-w796

可以看到在 IO 密集型操作的 Web 应用中,启用 JIT 与不启用相比,性能不但没有提升,反而有 10% 左右的损耗,至少在 Laravel 应用中是如此。

小结

当然,这里的测试仅限于的 Ubuntu 虚拟机环境(Windows WSL 版,配置是 8C8G),并且我也只是将 JIT 参数调整为官方建议的参数,没有做更多的对比测试,但是可以肯定的是 JIT 对 CPU 密集型操作优化效果很好,对 Web 应用性能是否有提升,取决于你的环境和配置的调优,因此 JIT 对 IO 密集型操作应用的性能优化效果有限,更适用于 CPU 密集型操作场景的性能优化,比如图像处理、机器学习等。

Atas ialah kandungan terperinci PHP 8新特性之JIT对PHP应用性能的影响. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara menggunakan php 8 dengan selamat Cara menggunakan php 8 dengan selamat Mar 03, 2025 pm 04:54 PM

Butiran panduan ini menjamin penyebaran Php 8. Ia meliputi amalan peringkat kod (pengesahan input, pengekodan output, pengurusan ketergantungan), proses penempatan (kawalan versi, pementasan), dan keselamatan pelayan (kemas kini, firewall, https). Mai

Panduan Pemasangan Php 8: Langkah demi Langkah untuk Windows, MacOS, dan Linux Panduan Pemasangan Php 8: Langkah demi Langkah untuk Windows, MacOS, dan Linux Mar 10, 2025 am 11:14 AM

Panduan ini memperincikan pemasangan PHP 8 pada Windows, MacOS, dan Linux. Ia meliputi langkah-langkah khusus OS, termasuk menggunakan pengurus pakej (homebrew, apt), pemasangan manual dari sumber, dan mengkonfigurasi PHP dengan Apache atau nginx. Petua penyelesaian masalah adalah

Cara Melaksanakan Ujian Keselamatan di Php 8 Cara Melaksanakan Ujian Keselamatan di Php 8 Mar 03, 2025 pm 04:58 PM

Artikel ini menyediakan panduan komprehensif untuk ujian keselamatan untuk aplikasi Php 8. Ia memperincikan pelbagai kaedah ujian, termasuk analisis statik & dinamik, kajian semula kod, dan pengimbasan kelemahan, menonjolkan alat seperti Mazmur, Owasp Zap, A

Cara menapis input dalam php 8 Cara menapis input dalam php 8 Mar 03, 2025 pm 05:01 PM

Artikel ini meneroka penapisan input yang selamat dalam Php 8, menekankan pencegahan kelemahan seperti suntikan SQL dan XSS. IT memperincikan pengesahan, sanitisasi, dan pertanyaan parameter sebagai teknik teras, yang menganjurkan inci pendekatan berbilang lapisan

Cara Melaksanakan Pengesahan Multi-Faktor Dalam Php 8 Cara Melaksanakan Pengesahan Multi-Faktor Dalam Php 8 Mar 03, 2025 pm 04:55 PM

Butiran artikel ini melaksanakan Pengesahan Multi-Faktor (MFA) dalam Php 8 menggunakan TOTP. Ia meliputi aspek utama: Generasi & Penyimpanan Kunci Rahsia, Generasi & Pengesahan Kod TOTP, Amalan Pengekodan Selamat (Pengesahan Input, Pengehadan Kadar, H

Cara Menggunakan Firewall Aplikasi Web di Php 8 Cara Menggunakan Firewall Aplikasi Web di Php 8 Mar 03, 2025 pm 05:02 PM

Artikel ini memperincikan bagaimana untuk meningkatkan keselamatan aplikasi Php 8 menggunakan firewall aplikasi web (WAF). Ia meliputi integrasi WAF (mis., Cloudflare, AWS WAF), Amalan Terbaik (Kemas Kini Biasa, Pembalakan yang Kukuh), Mengurangkan Kelemahan Biasa (SQL Dalam

Cara menetapkan kebenaran fail yang sesuai dalam php 8 Cara menetapkan kebenaran fail yang sesuai dalam php 8 Mar 03, 2025 pm 04:57 PM

Artikel ini menekankan amalan kebenaran fail yang selamat di Php 8. Ia menganjurkan keizinan menetapkan secara luaran, menggunakan prinsip keistimewaan paling sedikit, dan mengelakkan penggunaan ChMod () dinamik dalam kod PHP untuk mengurangkan risiko keselamatan. Notati oktal yang betul

Cara Mencegah Kebocoran Maklumat di Php 8 Cara Mencegah Kebocoran Maklumat di Php 8 Mar 03, 2025 pm 05:00 PM

Butiran artikel ini menghalang kebocoran maklumat dalam PHP 8. Ia menekankan pengekodan selamat, pengesahan input, pengendalian ralat yang mantap, dan menggunakan ciri-ciri keselamatan terbina dalam PHP untuk mengurangkan kelemahan seperti suntikan SQL dan XSS. Amalan terbaik

See all articles