PHP7.0正式版编译安装升级及WordPress问题解决分享

盼望以久的 PHP 7.0 正式版,终于在今天发布了!

官方给出的新特性如下:

PHP 7.0.0 comes with new version of the Zend Engine with features such as (incomplete list):

  • Improved performance: PHP 7 is up to twice as fast as PHP 5.6
  • Consistent 64-bit support
  • Many fatal errors are now Exceptions
  • Removal of old and unsupported SAPIs and extensions
  • The null coalescing operator (??)
  • Combined comparison Operator (<=>)
  • Return Type Declarations
  • Scalar Type Declarations
  • Anonymous Classes

至于新特性是什么,百度一下都有大牛给出很详细的解释,不过我也看不太懂,但是我看懂了一条:

  • Improved performance: PHP 7 is up to twice as fast as PHP 5.6
  • PHP7 的性能将是 PHP5.6 的 2 倍!

好了,其他就不用看了,单这一条就已经有升级的动力了吧!

之前就用过 RC 版本,性能确实提高了很多,但是在 PHP7.0 环境中,Begin 主题存在不少问题,由于不是正式版,我也就懒得花时间去解决了。

今天官方发布了正式版,于是利用下班时间给博客编译安装了 PHP7.0,且一并解决了 Begin 主题依然存在的不兼容问题,下面简单的分享下。

一、编译安装

以下安装步骤是在已有 PHP5 的环境下进行的,不保证能够顺利完成,仅供参考。

①、下载 PHP

cd /usr/local/src
#下载安装包
wget http://cn2.php.net/distributions/php-7.0.0.tar.gz

这是 PHP 官方的 PHP7.0 正式版的国内 CDN 下载地址,可以放心下载。

②、解压编译

基本大家伙都已经安装了 PHP 的 5.6 或更老的版本,所以我们可以编译安装到一个新的路径。

#进入安装目录
cd php-7.0.0

#编译安装
#因为是在已经有PHP5.6的环境下安装,下面的参数基本不会报错,如果报错,那么缺少什么就补什么吧!
CFLAGS= CXXFLAGS= ./configure --prefix=/usr/local/php7 --with-config-file-path=/usr/local/php7/etc \
--with-fpm-user=www --with-fpm-group=www --enable-fpm --enable-opcache \
--disable-fileinfo --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-jpeg-dir \
--with-iconv-dir=/usr/local --with-freetype-dir  --with-png-dir --with-zlib --disable-rpath \
--with-libxml-dir=/usr --enable-xml  --enable-bcmath --enable-shmop --enable-exif --with-curl \
--enable-sysvsem --enable-inline-optimization  --enable-mbregex --enable-inline-optimization \
--enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl \
--with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-ftp \
--with-gettext --enable-zip --enable-soap --disable-ipv6 --disable-debug

#继续make
make ZEND_EXTRA_LIBS='-liconv'

#最后make install完成安装
make install

上面的编译安装激活了 opcache 缓存,如果不需要可以去掉 --enable-opcache,个人推荐使用。

③、设置参数

#以下操作均在php-7.0.0这个安装目录下执行
php_install_dir=/usr/local/php7
cp php.ini-production $php_install_dir/etc/php.ini
Mem=`free -m | awk '/Mem:/{print $2}'`
if [ $Mem -gt 1024 -a $Mem -le 1500 ];then
    Memory_limit=192
elif [ $Mem -gt 1500 -a $Mem -le 3500 ];then
    Memory_limit=256
elif [ $Mem -gt 3500 -a $Mem -le 4500 ];then
    Memory_limit=320
elif [ $Mem -gt 4500 ];then
    Memory_limit=448
else
    Memory_limit=128
fi
sed -i "s@^memory_limit.*@memory_limit = ${Memory_limit}M@" $php_install_dir/etc/php.ini
sed -i 's@^output_buffering =@output_buffering = On\noutput_buffering =@' $php_install_dir/etc/php.ini
sed -i 's@^;cgi.fix_pathinfo.*@cgi.fix_pathinfo=0@' $php_install_dir/etc/php.ini
sed -i 's@^short_open_tag = Off@short_open_tag = On@' $php_install_dir/etc/php.ini
sed -i 's@^expose_php = On@expose_php = Off@' $php_install_dir/etc/php.ini
sed -i 's@^request_order.*@request_order = "CGP"@' $php_install_dir/etc/php.ini
sed -i 's@^;date.timezone.*@date.timezone = Asia/Shanghai@' $php_install_dir/etc/php.ini
sed -i 's@^post_max_size.*@post_max_size = 50M@' $php_install_dir/etc/php.ini
sed -i 's@^upload_max_filesize.*@upload_max_filesize = 50M@' $php_install_dir/etc/php.ini
sed -i 's@^;upload_tmp_dir.*@upload_tmp_dir = /tmp@' $php_install_dir/etc/php.ini
sed -i 's@^max_execution_time.*@max_execution_time = 600@' $php_install_dir/etc/php.ini
sed -i 's@^;realpath_cache_size.*@realpath_cache_size = 2M@' $php_install_dir/etc/php.ini
sed -i 's@^disable_functions.*@disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,popen@' $php_install_dir/etc/php.ini
sed -i 's@^session.cookie_httponly.*@session.cookie_httponly = 1@' $php_install_dir/etc/php.ini
sed -i 's@^mysqlnd.collect_memory_statistics.*@mysqlnd.collect_memory_statistics = On@' $php_install_dir/etc/php.ini
[ -e /usr/sbin/sendmail ] && sed -i 's@^;sendmail_path.*@sendmail_path = /usr/sbin/sendmail -t -i@' $php_install_dir/etc/php.ini
#如果编译时去掉了 --enable-opcache,则以下包含opcache的都请忽略
sed -i 's@^\[opcache\]@[opcache]\nzend_extension=opcache.so@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.enable=.*@opcache.enable=1@' $php_install_dir/etc/php.ini
sed -i "s@^;opcache.memory_consumption.*@opcache.memory_consumption=$Memory_limit@" $php_install_dir/etc/php.ini
sed -i 's@^;opcache.interned_strings_buffer.*@opcache.interned_strings_buffer=8@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.max_accelerated_files.*@opcache.max_accelerated_files=4000@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.revalidate_freq.*@opcache.revalidate_freq=60@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.save_comments.*@opcache.save_comments=0@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.fast_shutdown.*@opcache.fast_shutdown=1@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.validate_timestamps.*@opcache.validate_timestamps=1@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.enable_cli.*@opcache.enable_cli=1@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.use_cwd.*@opcache.use_cwd=1@' $php_install_dir/etc/php.ini
sed -i 's@^opcache.max_accelerated_files.*@opcache.max_accelerated_files=100000@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.max_wasted_percentage.*@opcache.max_wasted_percentage=5@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.consistency_checks.*@opcache.consistency_checks=0@' $php_install_dir/etc/php.ini
sed -i 's@^;opcache.optimization_level.*@;opcache.optimization_level=0@' $php_install_dir/etc/php.ini

# php-fpm直接沿用之前的配置即可
cp -f /usr/local/php/etc/php-fpm.conf /usr/local/php7/etc/

Ps:以上参数等代码从lnmp 一键安装包中提取。

④、版本替换

php 7 已经安装到了 /usr/local/php7,为了让 2 个版本暂时都存在,方便过渡,这里我们使用软链接搞定

#停止php-fpm
service php-fpm stop

#重命名php老版本
cd /usr/local
mv php php5

#建立php7的软链接
ln -s php7 php

#启动php-fpm
service php-fpm start

哦了,做完以上步骤,要是没报错基本就已经搞定了,执行一下 php --version 应该可以看到版本信息了

PHP 7.0.0 (cli) (built: Dec  2 2015 19:44:28) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies

二、问题解决

升级到 PHP7 之后,网站不出意外的白屏了!但是,不必惊慌,静下心来看看是什么问题。

①、不兼容某些 PHP 加密方案

直接编辑 wp-config.php,插入如下内容开启 PHP 的错误显示:

error_reporting(E_ALL);  
ini_set('display_errors', '1');

保险起见,刷新下 php,因为 opcache 可能有缓存:

service php-fpm reload

再次刷新网站,发现原来是鸟哥的 Begin 加密带来的错误,看来 PHP7 不支持这个加密形式。好吧,直接找鸟哥要来一份没有加密的 Begin,继续测试。

②、重复函数冲突

替换最新未加密 Begin 主题之后,毫无意外,还是报错...

看了下,原来是鸟哥把归档页面自动更新的那个函数添加到了主题,和我的子主题已有函数存在冲突。

直接注释其一,搞定!

③、评论没有内容

解决完上面几个问题之后,正在享受 PHP7 带来的提速快感,突然发现前台和后台都不显示评论内容了!只显示评论作者等信息。

突然想起之前测试 PHP7 RC 版本的时候就出现过,但是没有深究直接放弃了。

定位方法很简单,再次开启 PHP 所有错误显示,然后刷新后台评论界面,发现有如下报错:

原来是 preg_replace 函数在 PHP7 中已经弃用了/e 这个参数,改用了 preg_replace_callback 函数。

于是,找到错误所指向的文件及函数,发现是评论贴图功能,于是把/e 去掉或改成/i 试了下,暂时没发现有啥问题,估计贴图功能会有异常吧!

暂时没空研究如何替换成 preg_replace_callback 函数,后面再具体研究学习下。

三、简单测试

问题解决了,应该测试下性能了。

不过,一直也没用过啥专业的性能测试工具,粗人一个,直接目测后台同一个页面加载效果。

PHP 5.6 加载 WordPress 后台【所有文章】页面,头部响应耗时 2.6s

PHP 7.0 加载 WordPress 后台【所有文章】页面,头部响应耗时 1.5s

简单目测已经高下立分!绝对不是心理作用,后台速度提升相当明显了。

当然,博客前台我一直是用的纯静态,所以升级 php7 也只是为了提升自己的后台体验!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏nnngu

经典Java面试题收集(二)

经典的Java面试题(第二部分),这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答:Servl...

5478
来自专栏magicsoar

html5利用websocket完成的推送功能(tomcat)

利用websocket和java完成的消息推送功能,服务器用的是tomcat7.0.42,一些东西是自己琢磨的,也不知道恰不恰当,不恰当处,还请各位见谅,并指出...

5206
来自专栏阿杜的世界

聊聊单元测试

单元测试(unit testing):是指对软件中的最小可测试单元进行检查和验证。

1241
来自专栏java思维导图

mybatis-plus思维导图,让mybatis-plus不再难懂

 Mybatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果...

1.4K18
来自专栏信安之路

Bypass 360主机卫士SQL注入防御(多姿势)

在服务器客户端领域,曾经出现过一款 360 主机卫士,目前已停止更新和维护,官网都打不开了,但服务器中依然经常可以看到它的身影。

2690
来自专栏老码农专栏

原 荐 RESTFul 服务测试自动化的艺术

1623
来自专栏Python

linux每日命令(26):Linux文件属性详解

Linux 文件或目录的属性主要包括:文件或目录的节点、种类、权限模式、链接数量、所归属的用户和用户组、最近访问或修改的时间等内容。具体情况如下:

1281
来自专栏技术墨客

Hazelcast集群服务(1)——Hazelcast介绍

    “分布式”、“集群服务”、“网格式内存数据”、“分布式缓存“、“弹性可伸缩服务”——这些牛逼闪闪的名词拿到哪都是ITer装逼的不二之选。在Javaer的...

3693
来自专栏Java技术栈

给你一份超详细 Spring Boot 知识清单

在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架。或许从命名上就能看出这个框架的设计初衷:快速的启动Spring应用。因而Spri...

1362
来自专栏大魏分享(微信公众号:david-share)

今儿咱说说消息那些事 | 从开发角度看应用架构17

不是。例如Java应用对应用数据的访问,通过JPA的标准,实现ORM,这种方式就不是消息。

972

扫码关注云+社区

领取腾讯云代金券