Press "Enter" to skip to content

让PHP7达到最高性能的几个Tips

PHP7已经发布了, 作为PHP10年来最大的版本升级, 最大的性能升级, PHP7在多放的测试中都表现出很明显的性能提升, 然而, 为了让它能发挥出最大的性能, 我还是有几件事想提醒下.

PHP7 VS PHP5.6

1. Opcache

记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快, 所以之前测试时期就发生了有人一直没有启用Opcache的事情. 启用Opcache非常简单, 在php.ini配置文件中加入:

zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1"

2. 使用新的编译器

使用新一点的编译器, 推荐GCC 4.8以上, 因为只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持, 这个会带来5%左右的性能提升(Wordpres的QPS角度衡量)

其实GCC 4.8以前的版本也支持, 但是我们发现它支持的有Bug, 所以必须是4.8以上的版本才会开启这个特性.

3. HugePage

我之前的文章也介绍过: 让你的PHP7更快之Hugepage , 首先在系统中开启HugePages, 然后开启Opcache的huge_code_pages.

以我的CentOS 6.5为例, 通过:

$sudo sysctl vm.nr_hugepages=512

分配512个预留的大页内存:

$ cat /proc/meminfo  | grep Huge
AnonHugePages:    106496 kB
HugePages_Total:     512
HugePages_Free:      504
HugePages_Rsvd:       27
HugePages_Surp:        0
Hugepagesize:       2048 kB

然后在php.ini中加入:

 opcache.huge_code_pages=1

这样一来, PHP会把自身的text段, 以及内存分配中的huge都采用大内存页来保存, 减少TLB miss, 从而提高性能.

4. Opcache file cache

开启Opcache File Cache(实验性), 通过开启这个, 我们可以让Opcache把opcode缓存缓存到外部文件中, 对于一些脚本, 会有很明显的性能提升.
在php.ini中加入:

opcache.file_cache=/tmp

这样PHP就会在/tmp目录下Cache一些Opcode的二进制导出文件, 可以跨PHP生命周期存在.

5. PGO

我之前的文章: 让你的PHP7更快(GCC PGO) 也介绍过, 如果你的PHP是专门为一个项目服务, 比如只是为你的Wordpress, 或者drupal, 或者其他什么, 那么你就可以尝试通过PGO, 来提升PHP, 专门为你的这个项目提高性能.

具体的, 以wordpress 4.1为优化场景.. 首先在编译PHP的时候首先:

$ make prof-gen

然后用你的项目训练PHP, 比如对于Wordpress:

$ sapi/cgi/php-cgi -T 100 /home/huixinchen/local/www/htdocs/wordpress/index.php >/dev/null

也就是让php-cgi跑100遍wordpress的首页, 从而生成一些在这个过程中的profile信息.

最后:

$ make prof-clean
$ make prof-use && make install

这个时候你编译得到的PHP7就是为你的项目量身打造的最高性能的编译版本.

暂时就这么多吧, 以后想起来再加, 欢迎大家尝试, thanks

89 Comments

  1. Andy
    Andy 2019-03-19

    发现个问题,sysctl vm.nr_hugepages=128 之后,如果重启云服务器,会回复原来没有设置的参数。

  2. Silicone bracelets
    Silicone bracelets 2019-02-16

    Hey very cool web site!! Man .. Beautiful .. Superb ..
    I’ll bookmark your blog and take the feeds also?I’m happy to find numerous useful
    information right here within the publish, we need work out
    extra strategies in this regard, thank you for sharing. https://www.doming-labels.com

  3. William
    William 2018-08-27

    Huge page对于VPS其实作用有限。 Noisy VPS 的TLB经常会被其他邻居所影响,特别是当你的网站不是被频繁访问的时候。Huge page对于Dedicated Server或者Busy website的帮助比较大。

  4. William
    William 2018-08-27

    Very useful, thanks for sharing 🙂

  5. CDN西顿照明
    CDN西顿照明 2018-04-07

    感觉来这里的都是大神级别的。不是代码就是英文什么的,什么时候指导一下小弟。

  6. bra
    bra 2018-03-27

    网上都在说“只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持”,那么如何查看Global Register for opline and execute_data是否被开启呢?
    比如我系统的gcc是4.8,但是我使用yum安装php 7,此时我的Global Register for opline and execute_data支持有没有开启呢?

  7. gently
    gently 2018-01-30

    鸟哥你好,我最近在php7.1.13时开启opcache.enable_cli=1后 命令行出现崩溃,但是在7.2中就没有这个问题。请问是不是Bug。
    我的代码如下:
    try {
    echo ‘CCCC’;
    exit();
    }catch (Exception $exception) {
    var_dump($exception);
    echo ‘XXX’;
    exit();
    }

  8. heihei
    heihei 2018-01-17

    我的站今天装了这个 opcache,https://www.888meinv.com
    升级了下内存和 CPU,前几天访问量大,CPU天天 100%。。
    一看进程我擦,全是 php-fpm 禁用掉不必要的 WP 插件下去了一些一样很高,
    然后我对数据库做了分区表和索引调整,又下降一些。最后还是升级硬件效果最好 哈哈哈。

  9. […] 随着php7的到来,php的速度得到了很大的提升,然而不幸的是,php7较新,目前大多数的程序依然只支持在5.x系列版本的php上运行。以前用过xcache之类的php缓存库,以前没有特别关注,觉得开个缓存组件就够了,实际上打开xcache确实能得到不小的速度提升,但在使用drupal8的时候,我感受到了什么是龟速,偶然的机会,到了风雪之隅的网站,这是大神级的php人,php开发组核心组人员,中国惟一一位在php核心开发成员。那篇:让PHP7达到最高性能的几个Tips 不禁让我心旷神怡,php7可以,php5当然也可以。 […]

  10. bullet force
    bullet force 2017-05-29

    让你的PHP7更快之Hugepage , 首先在系统中开启HugePages, 然后开启Opcache的huge_code_pages.

  11. 雅思预测
    雅思预测 2017-04-29

    速度快了很多,不知道Hugepage对于php的运行提速有多大作用。

  12. phper
    phper 2017-02-07

    高级php技术交流 11153486,欢迎各位phper一起加群交流学习下。

  13. 美剧天堂
    美剧天堂 2017-01-05

    我用php7+opcache组合,感觉速度是快,但是我想知道这样对内存的占用是不是也高了

  14. Anonymous
    Anonymous 2016-11-14

    安装上面说的做的
    系统是centos7 .1
    fpm设置是
    pm = static
    pm.max_children = 1024

    重启之后 fpm启了好多僵尸进程 如下
    不知道什么原因
    [php-fpm]

  15. bjmayor
    bjmayor 2016-10-05

    NB。根据文章修改后,wordpress网站由原来的6.11提升到了14.55。 不过是因为一次性修改的,可能是之前就没有开启Opcache。

    效果应该是按你文章顺序来的吧。

  16. Cindy Ming
    Cindy Ming 2016-08-30

    鸟哥:

    最近我们基于您的yaf对我们一部分的业务逻辑代码做了性能的改进,现在我们遇到一个比较大的问题就是关于php echo的性能,也就是render哪块如果我需要render一个很大的字符串,pts只有200,同样的环境和机器我们其它的业务逻辑可以达到pts 8k多。

    字符串:1.5kb

    我们的环境: PHP7 + Nginx, 开启了opcache, hugepage,gzip

    我们尝试过以下几个方案:
    1. ob_start(); 在字符串输出之前
    2. 对字符串进行切割:按照SendBufferSize的大小进行切割 然后foreach输出

    但是都没有好的提升。

    如果我们坚持用php 有什么好的办法 或者我们需要换一个语言。因为性能对于我们来说很重要

  17. yang
    yang 2016-08-29

    /bin/sh /usr/local/src/php-7.0.10/libtool –silent –preserve-dup-deps –mode=compile gcc -I”/usr/local/include” -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 -Iext/iconv/ -I/usr/local/src/php-7.0.10/ext/iconv/ -DPHP_ATOM_INC -I/usr/local/src/php-7.0.10/include -I/usr/local/src/php-7.0.10/main -I/usr/local/src/php-7.0.10 -I/usr/local/src/php-7.0.10/ext/date/lib -I/usr/include/libxml2 -I/usr/local/src/php-7.0.10/ext/sqlite3/libsqlite -I/usr/local/src/php-7.0.10/TSRM -I/usr/local/src/php-7.0.10/Zend -I/usr/local/include -g -O2 -fvisibility=hidden -c /usr/local/src/php-7.0.10/ext/iconv/iconv.c -o ext/iconv/iconv.lo
    /usr/local/src/php-7.0.10/ext/iconv/iconv.c: 在函数‘php_iconv_string’中:
    /usr/local/src/php-7.0.10/ext/iconv/iconv.c:590:21: 警告:传递‘libiconv’的第 2 个参数时在不兼容的指针类型间转换 [-Wincompatible-pointer-types]
    result = iconv(cd, (const char **) &in_p, &in_size, (char **)
    ^
    In file included from /usr/local/src/php-7.0.10/ext/iconv/iconv.c:45:0:
    /usr/local/include/iconv.h:81:15: 附注:需要类型‘char **’,但实参的类型为‘const char **’
    #define iconv libiconv
    ^
    /usr/local/include/iconv.h:83:15: 附注:in expansion of macro ‘iconv’
    extern size_t iconv (iconv_t cd, char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft);
    ^~~~~

Leave a Reply to PHP笔记 – 初出茅庐 Cancel reply

Your email address will not be published. Required fields are marked *