美文网首页PHP开发PHP经验分享程序猿的进阶屋
PHP8.0源码编译安装、JIT测试和让你爱不释手的Match表

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

作者: KunkkaWu | 来源:发表于2020-07-14 17:40 被阅读0次
    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. 解决出现依赖异常
    • 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.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中暂时未能使用

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/abexhktx.html