概要: PHP8.0 Alpha2 源码编译安装 、 JIT配置与性能分析、新特性Match表达式
PHP8.0 Alpha2 源码编译安装
-
PHP8.0 Alpha2 源码下载地址:
- 官网下载地址: https://downloads.php.net/~carusogabriel/ [推荐]
- Github下载地址: https://github.com/php/php-src/releases/tag/php-8.0.0alpha2
-
服务器环境:Centos 7.4
编译安装过程
1.下载源码
wget https://downloads.php.net/~carusogabriel/php-8.0.0alpha2.tar.gz
2. 解压缩
tar -zxvf php-src-php-8.0.0alpha2.tar.gz
3. 进入解压后的文件夹
cd php-src-php-8.0.0alpha2
4. 编译
./configure --prefix=/usr/local/php8 \
--with-config-file-path=/usr/local/php8 \
--enable-mbstring \
--enable-ftp \
--enable-gd \
--enable-gd-jis-conv \
--enable-mysqlnd \
--enable-pdo \
--enable-sockets \
--enable-fpm \
--enable-xml \
--enable-soap \
--enable-pcntl \
--enable-cli \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-pear \
--with-zlib \
--with-iconv \
--enable-opcache
5. 解决出现依赖异常
- libxml-2.0异常:
configure: error: Package requirements (libxml-2.0 >= 2.7.6) were not met: No package 'libxml-2.0' found
解决:安装 libxml2-devel.x86_64
yum install libxml2-devel.x86_64
- sqlite3异常
configure: error: Package requirements (sqlite3 > 3.7.4) were not met: No package 'sqlite3' found
解决:安装sqlite3
yum install sqlite-devel.x86_64
- libpng异常
configure: error: Package requirements (libpng) were not met: No package 'libpng' found
解决:安装libpng-devel
yum install libpng-devel
- oniguruma 异常
configure: error: Package requirements (oniguruma) were not met: No package 'oniguruma' found
解决:安装oniguruma-devel
yum install oniguruma-devel
6. 安装
make && make install
7. 查看版本
[root@p41450v php-8.0.0alpha2]# /usr/local/php8/bin/php -v
PHP 8.0.0alpha2 (cli) (built: Jul 14 2020 14:54:05) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
8. 配置环境
ln -s /usr/local/php8/bin/php /usr/bin/php8
cp php.ini-production /usr/local/php8/php.ini
ln -s /usr/local/php8/sbin/php-fpm /usr/bin/php8-fpm
9. 配置JIT
编辑php.ini
vi /usr/local/php8/php.ini
打开opcache扩展
zend_extensions=opcache //去掉前面的分号
opcache.enable=1 //去掉前面的分号,0改成1
opcache.enable_cli=1 //去掉前面的分号
如果
zend_extensions=opcache
加载扩展失败,可使用zend_extension = "/usr/local/php8/lib/php/extensions/no-debug-non-zts-20190128/opcache.so"
方式加载扩展
添加JIT配置【这里为了后面的测试暂时保留 ; 】
[JIT]
;opcache.jit=1205
;opcache.jit_buffer_size=64M
1205 参考 Laruence 的 https://www.laruence.com/2020/06/27/5963.html
保存退出
Zend/bench.php测试
分别执行 php8 -d opcache.jit_buffer_size=0 Zend/bench.php
和 php8 -d opcache.jit_buffer_size=64M -d opcache.jit=1205 Zend/bench.php
对比结果
结论: 启用JIT后 响应从 0.372 提升到 0.158 。性能翻倍,与官方公开的数据一致。
100万次for循环累加测试
创建测试文件t.php
vi t.php
写入:100万次for循环累加代码
$start = microtime(true);
$total = 0;
for ($i=0; $i < 1000000; $i++) {
$total += $i;
}
echo "Total: " . $total . "\n";
$spend = floor((microtime(true) - $start) * 1000);
echo "Time use: " . $spend . " ms\n";
分别执行对比结果:
5.png
从结果中可以看出: 开启JIT后,执行时长从 10ms 提升到 3ms, 性能为原来的3倍多。
新特性之Match表达式
match 从字面上就可以感觉出是和匹配相关的。没错,就是功能类似switch,但是语法和书写更方便的表达式。
match常规示例
我们先来看一个switch的例子:
switch ($status) {
case '1':
return 'a';
break;
case '2':
return 'b';
break;
default:
return 'c'
break;
}
如果使用match,则更简洁:
$result = match($status) {
1 => 'a',
2 => 'b',
default => 'c',
};
match多条件匹配
$result = match($status) {
1,3 => 'a',
2,4 => 'b',
default => 'c',
};
match多条件,执行代码块
$result = match($status) {
1,3 => {
func1();
func2();
},
2,4 => func3(),
default => 'c',
};
PS: Match表达式,将可能在8.0其他版本中体现,目前8.0Alpha2中暂时未能使用
网友评论