• PHP7通过yum源安装及性能测试


    提到PHP,肯定会有人说这是世界上最好的编程语言。单说流行程度,目前全球超过81.7%的服务器后端都采用了PHP语言,它驱动着全球超过2亿多个网站。上月初PHP7正式版发布,迎来自2004年以来最大的版本更新。现在PHP 7.0正式发布。

    对于普通的PHP网站,主要是IO密集型的,瓶颈在MySQL数据之上,体现不出来PHP性能的劣势。但在密集计算方面比C、C++、Java这种静态编译型语言差几十倍甚至上百倍。如果在PHP开发中使用了比较复杂的框架,如symfony,程序性能会明显下降。事实上,PHP语言最初的设计,就不是用来解决计算密集型的应用场景。我们可以这样粗略理解为,PHP为了提升开发效率,而牺牲了执行效率。

    但PHP比较流行,如新浪微博、Facebook这种大型网站大部分程序都是使用PHP写的,也就是在这种大规模应用下,PHP性能低下就显现出来了。Facebook早期的很多代码是使用PHP来开发的,但是,随着业务的快速发展,PHP执行效率成为越来越明显的问题。为了优化执行效率,Facebook在2008年就开始使用HipHop,这是一种PHP执行引擎,最初是为了将Fackbook的大量PHP代码转成 C++,以提高性能和节约资源。使用HipHop的PHP代码在性能上有数倍的提升。后来,Facebook将HipHop平台开源,逐渐发展为现在的HHVM。HHVM用来替换PHP自身使用的引擎Zend Engine。据说性能提升了70%。当然PHP官方也知道PHP最大的短板,于是推出了PHP7项目,主要是重构了Zend Engine引擎。

    PHP7最显著的变化就是性能的极大提升,已接近Facebook开发的PHP执行引擎HHVM。在WordPress基准性能测试中,速度比5.6版本要快2~3倍,大大减少了内存占用。PHP7在语言上也有一些变化,比如添加返回类型声明、增加了一些新的保留关键字等。在安全方面,去除了PHP安全模式,添加魔术引号等。不仅如此,新版还支持64位,而且包含最新版Zend引擎。其实PHP7的在真实场景的性能确实已经和HHVM相当,在一些场景甚至超过了HHVM。但HHVM的运维复杂, 是多线程模型, 这就代表着如果一个线程导致crash了, 那么整个服务就挂了, 并且它不会自动重启。另外它采用JIT, 那么意味着, 重启以后要预热, 没有预热的情况下, 性能较为糟糕。并且多线程模型调试困难, 这对于追求稳定来说的Web服务来说, 是非常不适合的。

    YUM安装PHP7

    想使用最新版PHP,就需要使用到REMI源,Remi repository是包含最新版本PHP和MySQL包的Linux源,由Remi提供维护。有个这个源之后,使用YUM安装或更新PHP、MySQL较新版本了。

    安装最新的Remi源自动安装文件

    # CentOS 6 / RHEL 6
    yum install http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
    
    # CentOS 7 / RHEL 7
    yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
    

    安装PHP相关组件,下面提供的是一个生产环境中可以使用的标配安装。

    $ yum --enablerepo=remi,remi-php70 install
    php 
    php-cgi 
    php-cli 
    php-fpm 
    php-common 
    php-devel 
    php-mysqlnd 
    php-mysql 
    php-sqlite3 
    php-mbstring 
    php-msgpack 
    php-mcrypt 
    php-bcmath 
    php-gd 
    php-xml 
    php-ldap 
    php-xmlrpc 
    php-opcache 
    php-curl 
    php-json 
    php-odbc 
    php-pdo 
    php-bz2 
    php-xml 
    php-ftp 
    php-imap 
    php-snmp 
    php-redis 
    php-memcached
    

    查看PHP版本

    $ php -v
    PHP 7.0.9 (cli) (built: Jul 20 2016 18:08:08) ( NTS )
    

    启动PHP-FPM

    $ service php-fpm start
    

    到这里,PHP7.0就安装完成了。如果需要用到PHP扩展功能,如redis、memcached等,只需要也使用YUM安装即可,如下:

    $ yum --enablerepo=remi,remi-php70 install php-redis php-memcached
    

    如果在REMI或EPEL源中都找不到你需要的扩展模块,那么就需要手动编译安装了,也很简单。

    另外查看PHP模块信息使用php -m命令。

    $ php -m | grep redis
    redis
    

    安装一套LNMP参考:LNMP安装包部署实战或者参考PHP7.0版本的LNMPZabbix 3.0安装使用详解

    PHP7性能测试

    环境:4核 CPU,内存4G,操作系统Centos 6.5。

    首先说一点GCC编译器的建议,据鸟哥建议,使用新一点的编译器,推荐 GCC 4.8以上,因为只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持, 这个会带来5%左右的性能提升。

    写一段程序(网上提供的简单测试方法):

    第一段,生成一个 60 万元素的数组,通过查找key 的方式,来确定key是否存在。

    < ?php
    $a = array();
    for($i=0;$i<600000;$i++){
      $a[$i] = $i;
    }
     
    foreach($a as $i)
    {
     array_key_exists($i, $a);
    }
    

    首先是PHP 5.3.17版。

    [root@localhost test]# time php search_by_key.php 
    real 0m0.389s
    user 0m0.337s
    sys  0m0.051s
    [root@localhost test]# time php search_by_key.php 
    real 0m0.378s
    user 0m0.308s
    sys  0m0.062s
    [root@localhost test]# time php search_by_key.php 
    real 0m0.378s
    user 0m0.317s
    sys  0m0.061s
    

    其次是PHP 7.0版本。

    [root@localhost php7]# time php7 search_by_key.php
    real 0m0.082s
    user 0m0.066s
    sys  0m0.014s
    [root@localhost php7]# time php7 search_by_key.php
    real 0m0.080s
    user 0m0.058s
    sys  0m0.021s
    [root@localhost php7]# time php7 search_by_key.php
    real 0m0.080s
    user 0m0.053s
    sys  0m0.026s`
    

    响应时间在PHP7下运行变为原来的1/4。

    还是上面的这个方式,不过由于速度较慢,所以变成了一个60000个元素的数组,查找值。

    < ?php
    $a = array();
    for($i=0;$i<600000;$i++){
      $a[$i] = $i;
    }
     
    foreach($a as $i)
    {
     array_key_exists($i, $a);
    }
    
    [root@localhost test]# time php search_by_val.php 
    real 0m24.296s
    user 0m24.184s
    sys  0m0.025s
    [root@localhost test]# time php search_by_val.php 
    real 0m25.523s
    user 0m25.317s
    sys  0m0.026s
    [root@localhost test]# time php search_by_val.php 
    real 0m26.026s
    user 0m25.478s
    sys  0m0.092s
    

    等待的时间,总是觉得很漫长,三次测试,花掉了75秒多。下面,PHP 7 登场了。

    [root@localhost php7]# time php7 search_by_val.php
    real 0m3.362s
    user 0m3.323s
    sys  0m0.007s
    [root@localhost php7]# time php7 search_by_val.php
    real 0m3.266s
    user 0m3.251s
    sys  0m0.004s
    [root@localhost php7]# time php7 search_by_val.php
    real 0m3.290s
    user 0m3.275s
    sys  0m0.006s
    

    有没有!速度整整提高了将近7倍。

  • 相关阅读:
    jQuery attr 与 prop 区别最简单分析
    Js事件处理模型/周期
    canvas实现点击带水纹的按钮
    js作用域问题
    js 函数里的 this
    css3: scrollLeft,scrollWidth,clientWidth,offsetWidth 的区别
    C# 中的Async 和 Await 的用法详解
    1、Task的优势
    探秘C#中的yield关键字
    详解C#中 Thread,Task,Async/Await,IAsyncResult的那些事儿
  • 原文地址:https://www.cnblogs.com/linuxprobe/p/10425933.html
Copyright © 2020-2023  润新知