php 7

前言

为了在上线前保证router的安全和高效。罐头最近反复在优化代码,手忙脚乱的,周五差点还把公司给的这台笔记本给弄炸了。幸好运维大大给我修好了。使用了AB工具进行压测之后,发现结果并不让人满意。开始着手尝试一下PHP7,或者是Yaf之类的。

基本任务:在同一台虚拟机装两个版本的PHP,便于比较和测试。

准备

  • 先备份一下虚拟机,做一个快照
  • 再备份一下PHP 5.6的配置
  • 准备php 7的安装

安装过程

1
2
3
4
[root]# cd /dist/src/
[root]# wget http://cn2.php.net/distributions/php-7.0.11.tar.gz
[root]# tar xzf php-7.0.11.tar.gz
[root]# cd php-7.0.11
1
2
# 注意目录前缀要修改一下为 php7
[root]# ./configure --prefix=/usr/local/php7 --with-config-file-scan-dir=/etc/php7 --with-pdo-mysql=/usr/local/mysql/bin/mysql_config --with-mysqli=/usr/local/mysql/bin/mysql_config --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --enable-gd-native-ttf --enable-zip --with-zlib --with-gd --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --with-curl --enable-mbstring --with-mcrypt --disable-ipv6 --enable-static --enable-maintainer-zts --enable-sockets --enable-soap --with-openssl --without-pdo-sqlite --enable-fpm --with-unixODBC=/usr/ --enable-opcache
1
2
3
4
#我这边编译完之后,发现一个报错
error: ODBC header file '/usr//include/sqlext.h' not found!
原来缺少一个unixODBC库
[root]# yum -y install unixODBC*
1
2
#编译通过,继续
[root]# make
1
2
3
4
5
#再次发现错误
collect2: ld returned 1 exit status
make: *** [sapi/cli/php] Error 1
主要原因:没給到要 link 的 iconv 函式库参数
解决方法:编辑Makefile 大约77 行左右的地方: EXTRA_LIBS = ..... -lcrypt 在最后加上 -liconv
1
2
#继续
[root]# make install
1
2
3
4
5
6
7
8
9
10
11
#安装成功
[root]# /usr/local/php7/bin/php -v
PHP 7.0.11 (cli) (built: Sep 28 2016 04:55:47) ( ZTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
---
[root]# php -v
PHP 5.6.22 (cli) (built: Jun 3 2016 11:44:17)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
with Zend Guard Loader v3.3, Copyright (c) 1998-2014, by Zend Technologies
1
2
#配置
[root]# cp -f /dist/src/php-7.0.11/php.ini-production /etc/php7/php.ini
1
2
3
4
5
6
#php-fpm配置
[root]# cp -f /dist/src/php-7.0.11/sapi/fpm/init.d.php-fpm /etc/init.d/php7-fpm
[root]# chmod +x /etc/init.d/php7-fpm
[root]# cd /usr/local/php7/etc/
[root]# cp -f php-fpm.conf.default php-fpm.conf
[root]# cp -f php-fpm.d/www.conf.default php-fpm.d/www.conf
1
2
3
4
5
6
7
8
#修改内容
[root]# vi www.conf
user = www
group = www
listen = /tmp/php7-cgi.sock
listen.owner = www
listen.group = www
listen.mode = 0660
1
2
3
#启动PHP
[root]# /etc/init.d/php7-fpm start
Starting php-fpm done
1
2
3
4
5
6
7
8
9
#ngnix配置
……
location ~ .*\.php$
{
include fastcgi.conf;
fastcgi_pass unix:/tmp/php7-cgi.sock; //使用PHP7
fastcgi_index index.php;
}
……

压测

硬件平台
  • CPU: Intel(R) Core(TM) i5-4200U CPU @ 1.60GHz
  • RAM: 1GB
软件环境
  • nginx/1.10.0
  • php 5.6.22
  • php 7.0.11
  • yii2
比较结果
  • 普通路由 ab -c 100 -n 1000
版本 Requests per second [#/s] Time per request [ms]
php 5.6.22 131.35 761.335
php 7.0.11 231.38 432.196
  • ORM操作 ab -c 100 -n 1000
版本 Requests per second [#/s] Time per request [ms]
php 5.6.22 96.47 1036.601
php 7.0.11 146.56 682.297
  • 复杂操作(路由+ORM+模板渲染) ab -c 100 -n 1000
版本 Requests per second [#/s] Time per request [ms]
php 5.6.22 58.07 1721.985
php 7.0.11 95.82 1043.623
  • 制造一个10万的数组,并且逐个使用array_key_exists遍历
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [root]# time php test.php
    real 0m0.171s
    user 0m0.121s
    sys 0m0.046s
    [root]# time /usr/local/php7/bin/php test.php
    real 0m0.031s
    user 0m0.023s
    sys 0m0.007s

由于个人虚拟机比较破,选取的样本数量虽然也不多,但是还是能看出性能差异的!有空再来介绍PHP7的新特性

罐头很懒 (⊙v⊙)<br><br>工作日日常 :<br>do {<br>&nbsp;&nbsp;打代码<br>} while ( 发呆 || 吃饭 )<br><br>周末日常 :<br>( 鱼罐头 || 午餐肉 || 炸鸡块 ) +<br>( 罐可乐 || 瓶啤酒 ) +<br>( 盒仔饭 || 艇仔粥 || 即食面 ) +<br>( 轻音乐 || 肥皂剧 || 热网综 ) +<br>( 水果糖 || 甜布丁 )