PHP开发PHP经验分享程序猿的进阶屋

PHP8.0源码编译安装、JIT测试和让你爱不释手的Match表

2020-07-14  本文已影响0人  KunkkaWu
6.png

概要: PHP8.0 Alpha2 源码编译安装 、 JIT配置与性能分析、新特性Match表达式

PHP8.0 Alpha2 源码编译安装

编译安装过程
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. 解决出现依赖异常
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
configure: error: Package requirements (sqlite3 > 3.7.4) were not met: No package 'sqlite3' found

解决:安装sqlite3

 yum install sqlite-devel.x86_64  
configure: error: Package requirements (libpng) were not met:  No package 'libpng' found

解决:安装libpng-devel

yum install libpng-devel
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.phpphp8 -d opcache.jit_buffer_size=64M -d opcache.jit=1205 Zend/bench.php 对比结果

4.png

结论: 启用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中暂时未能使用

上一篇 下一篇

猜你喜欢

热点阅读