• 写作本文的目的并非是提供一个完整且覆盖所有方面的PHP 7.0与WordPress的升级指南,只是就我存放于主机商HawkHost.com上的本网站,最近所做的一次升级所采取的步骤,以及所遇的问题与问题的解决,做一记录性的描述。故本文讨论的内容包括:

    • PHP 7.0的优势与升级必要性
    • WordPress的版本升级
    • PHP 7.0与W3 Total Cache的兼容性冲突与解决方案
    • PHP 7.0与其他WordPress插件的兼容性冲突与解决方案

    本文不会提及的内容包括:

    • PHP 7.0的下载及安装(请参照官方手册)

    而本文的第一部分,会探讨“为什么要升级PHP 7.0?”,但若你对PHP 7.0的优点已经了然于胸,那么完全可以跳过第一部分。此外,按照本文操作,需要你具备最基本的虚拟主机管理能力,比如:

    • 了解在cPanel管理界面中如何备份MySql数据库
    • 了解在Linux下如何使用tar命令打包文件目录
    • 按照指示编辑修改几个php程序文件等

    相信这对每一个拥有自己网站的读者来说,都不过是小菜一碟而已。

    为什么要升级到PHP 7.0?

    2015年12月3日,PHP社区宣布PHP 7.0的正式发布,此次发布较以往不同的是,直接跳过了版本6,直接从5.6跳跃到了7.0,也是对7.0这一历史性的突破的直接肯定。相较5.x版本来说, PHP 7.0的先天优势与新特性数不胜数,仅在短短的发布新闻中即提及了12项。但对于我们使用者而非开发者来说,最重大的两点优势就是:

    • 2-5倍于5.x版本的运行速度提升
    • 远小于5.x版本的运行内存占用

    我们来看看,根据PHP官方在2016年1月12日在都柏林的PHP见面会上给出的数据,PHP 7.0到底有多惊人。

    2-5倍于5.x版本的运行速度提升

    不同PHP版本运行环境下WordPress的并发处理能力
    据官方数据,测试所运行的WordPress 4.1.1,在并发20个客户端的情况下,运行于PHP 5.3时处理能力为每秒200个请求,运行于5.4-5.6时,处理能力分别为每秒250-261个请求,而当运行于7.0时,处理能力立即达到了惊人的每秒626个请求。相较于PHP 5.3而言,7.0运行环境下的WordPress的处理能力是前者的3倍强。

    而我是绝不会告诉你,PHP 7.0能取得这样骄人的性能,是得到了包括:

    • Facebook开发的开源PHP虚拟机HHVM (HipHop Virtual Machine)的JIT编译器思路的激励
    • 缩小化所有Zval变量结构、字串、数组、散列表等等数据结构上所作出的巨大改进,并极大提升了CPU缓存命中率
    • 函数调用机制的优化
    • ……

    等等这些改进才取得的。

    远小于5.x版本的运行内存占用

    PHP运行环境空载时内存使用基准值
    前面一节提到了的PHP 7.0在缩小化Zval、字串等等数据结构上作了巨大改进,这些具体的改进包括:

    • 将PHP中所有变量的真实载体Zval的大小从24个字节下降到16个字节
    • 将PHP5中由Hashtable构成的数组改变为默认由Zval构成
    • 将HashTable的大小从72下降到56字
    • 将Buckets的大小从72下降到32字节
    • 为数组元素的Buckets分配连续内存空间
    • 使数组元素的Key指向zend_string
    • 将数组元素的Value被嵌入到Bucket中

    而这些具体的改进最终也反映到了PHP 7.0的内存占用量上。

    WordPress在不同PHP版本下的内存占用
    PHP 7.0在空载下,其内存占用仅6.1MB,小于5.x其他版本的6.8MB-8.3MB的空载内存占用量。

    另一方面,WordPress在PHP 7.0下的内存占用量上,竟然能取得将近一个数量级的提升:从PHP 5.3版本的139.7MB,缩减到了PHP 7.0下仅仅15.3MB的内存使用量,进步之大令人咋舌。这样惊人的改进,对于很多像我一样不需要使用VPS主机的虚拟主机用户来说,在内存使用量上取得如此有力度的精减,实在是无法抗拒的。

    而PHP 7.0有了以上运行速度与内存占用上的两大技术飞跃,无论从成本还是效率上考虑,都没有延缓使用PHP 7.0的藉口!而接下去,我们就切入正题,讨论WordPress如何升级以及升级后将遇到的各类兼容性冲突以及对应的解决方法。

    本文所涉及的运行环境及软件版本

    在讨论升级前,应当先说明一下升级前后的运行环境与软件版本。本文中升级到PHP 7.0的主机为主机商HawkHost.com所提供的Premium主机,而合理的低价、优良的服务足以秒杀市面上绝大部分虚拟主机服务。

    升级前在该主机上运行的各软件版本为:

    • PHP 5.3.27
    • WordPress 3.5
    • WordPress缓存插件W3 Total Cache 0.9.2

    而升级后,各软件版本则为:

    • PHP 7.0.9
    • WordPress 4.5.3
    • WordPress缓存插件W3 Total Cache 0.9.4.1

    WordPress的版本升级

    由于WordPress的4.x版本已经可以运行在PHP 7.0之上,所以可以放心的直接将WordPress升级到最新的版本,但是由于第三方插件、主题,导致了不兼容的潜在可能,加之是一次主版本升级,所以我仍然选择中规中矩的做法。

    升级前的准备工作1:确认PHP 7.0运行环境已经存在

    cPanel中提供选择PHP版本
    首先要确认主机商所提供的PHP运行环境中已经包含了PHP 7.0,而7.0最近的一次版本更新,是一次安全版本更新,其版本号为7.0.9。我的主机商HawkHost.com已经很负责的将运行环境升级至该版本。而HawkHost使用的是cPanel的集成管理界面,因此可以很方便地在管理界面中选择PHP版本号。你可以通过你的主机商所提供的集成管理界面确认,但更稳妥的办法是与你的主机商取得联系,以确认是否提供了PHP 7.0的运行环境,以及具体的版本号。

    升级前的准备工作2:重新审视并清理所有WordPress插件

    一旦确认了主机运行环境中可以选择PHP 7.0,那么接下来就需要对WordPress中已安装的各类插件进行重新审视,并作出清理。在WordPress中保留不使用的插件、过时的插件、以及不再更新的插件,是造成潜在运行故障、性能问题、插件冲突、及其他不可预知行为的最主要原因。在一次主版本升级前,小心审视清理这些插件,尤其必要。

    清理时应遵循如下规则,如果对符合下列条件的WordPress插件,应当坚决删除:

    • 安装却从未启用的
    • 启用过但未继续使用的

    而符合以下情况的,应当选择其他支持更新良好的插件,予以替换,甚至选择删除:

    • 安装启用但已不敷使用的
    • 安装启用但已停止更新的

    而在完成插件的清理之后,就可以进入下一步:网站备份。

    升级前的准备工作3:备份数据库及网站

    WordPress插件中有多款插件可以提供网站备份的功能,如果你已经安装了其中的一款的话,可以直接使用。如果你没有安装这类插件,其实备份WordPress网站也是一件轻松的事,你只需要:

    1. 备份WordPress的MySql数据库
    2. 备份网站文件

    通常主机商的集成管理界面都会提供phpMyAdmin或者Backup功能。通过phpMyAdmin可以直接对MySql中的数据表进行导出,这种方式下,导出的脚本可选择项更多。而Backup功能则几乎等同于相机中的傻瓜机,只要点击数据库名,即可下载数据库备份文件。这两种备份方式的选择,完全取决于用户的需要了。至于网站文件的备份可以使用tar命令,本文不再赘述。

    而一旦完成了这两件事,也就可以进入真正的主题:升级WordPress并变更PHP运行环境。

    升级WordPress并变更PHP运行环境

    可以指定PHP版本,并选择PHP扩展包
    WordPress作为一个成熟的内容管理系统,其4.x版本是对PHP 7.0兼容的,因此只需要在WordPress中进行自动更新到最新版本即可,在我本次的升级中,WordPress所升级到的版本是4.5.3。

    前面提到过,我的主机商HawkHost.com使用cPanel集成管理系统,可以在管理界面中选择PHP版本。打开cPanel的PHP版本选择功能,会出现一个名为”PHP Selector|extensions”的界面,这个界面中显示了当前运行的PHP版本号 (Current PHP Version)。在下方有一个PHP版本号的下拉菜单,其中列出了主机商所提供可选的PHP版本号。在这个下拉单中选择7.0的选项,并点击右边的”Set as current”按钮,就把虚拟主机当前运行的PHP版本切换成了7.0。

    细心的你一定会发现,由于PHP版本的不同,其允许加载的PHP扩展包也不同。而在本站的升级中,只使用PHP 7.0的缺省扩展包即可,而你可以根据自己程序的需要,勾选所需的其他扩展包。

    在与WordPress最相关的扩展包变化中,影响最大的是7.0不再提供Memcache包,而只提供Memcached包。Memcache与Memcached虽然仅只一”d”字之差,但已足以使得著名的缓存插件W3 Total Cache(后文简称W3TC)失去了Memcache的选项。尽管在W3TC的支持论坛中已经有了一众用户要求提供Memcached支持,虽尚未看到W3TC的官方承诺,但因PHP 7.0的全面优势,故无论主机服务商还是网站站长,都将是7.0全面应用的助力推手,也可以预料W3TC对Memcached的支持不会拖太久。当然,如果一定要使用Memcached服务,也可以使用”Memcached Is My Friend”缓存插件。

    到这一步,PHP 7.0运行环境已经生效,理论上WordPress 4.x应在PHP 7.0下平稳地运行,但由于第三方插件与主题中,可能存在不兼容代码,因此接下来必须对这些兼容性冲突问题进行逐一解决。

    PHP 7.0与W3 Total Cache的兼容性冲突与解决方案

    当PHP 7.0运行环境生效后,WordPress的后台管理界面是能正常运行的,但如果你使用了W3TC缓存插件,那么你一定会发现以下两种情况之一:

    • 所有的前端网站页面都变成空白页面
    • 所有的前端网页的W3TC缓存都失效(页面源代码底部的W3TC缓存提示信息消失可确定W3TC失效)

    造成这两种情况的原因是相同的,都是因为W3TC程序中类似下面这段代码中第7句“function ob_callback(&$buffer)”的参数传递:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
        /**
         * Output buffering callback
         *
         * @param string $buffer
         * @return string
         */
        function ob_callback(&$buffer) {        global $wpdb;
     
            if ($buffer != '') {

    W3TC已经运行在PHP 7.0.9
    解决这一代码冲突则只需要将所有这行代码中的“&”删除,即修改为“function ob_callback($buffer)”即可。在W3TC插件的0.9.4.1版本中,共有6处这样的代码需要修改,我将这6个文件的文件路径列出如下:

    w3-total-cache/lib/W3/PgCache.php
    w3-total-cache/lib/W3/Plugin/BrowserCache.php
    w3-total-cache/lib/W3/Plugin/Cdn.php
    w3-total-cache/lib/W3/Plugin/Minify.php
    w3-total-cache/lib/W3/Plugin/NewRelic.php
    w3-total-cache/lib/W3/Plugin/TotalCache.php

    当对这6个文件修改完毕并替换服务器版本后,再刷新前端网站页面,会发现空白页面或者缓存失效的情况消失了,说明W3TC与PHP 7.0的兼容性冲突问题已经完全得到解决。

    PHP 7.0与其他插件的兼容性冲突与解决方案

    除了W3TC存在与PHP 7.0的兼容性冲突问题以外,其他的一些插件由于代码使用的函数已经在PHP 7.0中被废除,也会导致兼容性冲突问题。其中最常见的问题是字串的split()函数。

    在PHP 7.0中split()函数已经被废除,因此使用该函数的代码,可以使用另外两个函数来替换:

    • 如果用于分拆字串的是字符,则可以用explode()函数替代,这样可以省去解析正则表达式的额外开销
    • 如果用于分拆字串的是正则表达式,则可以使用preg_split()函数来替代

    在所有的插件、主题的php代码中搜索split()函数,并选择以上两个函数来区别替换,就可以解决此类兼容性冲突问题。

    结语

    至此,WordPress向PHP 7.0的升级已经完成了。尽管PHP 7.0作为新生事物,也导致了类似前述的W3TC失去Memcache支持的问题,但是综合来看,这些小问题与PHP 7.0带来的性能突破相比较后,PHP 7.0毋庸置疑是值得义无反顾地去选择的。

    扩展阅读

    转载申明

    如果你认为本文很有帮助,并希望转载,那么请务必:

    • 引用本文名称与永久地址:“手把手教你将WORDPRESS升级到PHP 7.0” (http://www.yuhua.org/upgrade-your-wordpress-to-php7/)
    • 或者,在正文中附加本网站名称与链接的署名:The Observing Mind (http://www.yuhua.org/)

    这对您的网站并不会造成任何损害,但是却是对我的时间、劳动与知识成果的尊重,谢谢!

    YH
    About YH

    『星際迷航(Star Trek)』及科幻輕度癡迷人仕、程序開發愛好者、項目管理實踐者及美國項目管理協會(PMI) Project Management Professional (PMP)®連續10年持證人、人力資源經理、陳式太極拳初階練習人、愛書的讀書人、輕度旅行者與博物館愛好者,以及隨意的數碼照片拍攝者。

    『旅行』是體驗和放鬆的好方法,『閱讀』是人生一日也不可缺少的生活方式,而『寫作』則是記錄歷史和整理思想的好工具。

    2 Responses to 手把手教你将WORDPRESS升级到PHP 7.0
    1. 2017 年 3 月 17 日 at 10:31

      你好,

      我目前想要换成php7.0,不过我的cache插件用的是,super cache,不知道有没有影响,还有php7.0的性能提升,是指网页打开速度吗?还是说只是服务器资源的减少

      • YH
        YH
        2017 年 7 月 17 日 at 21:30

        super cache没用过,不确定是否有影响。性能的提升指运行速度提升与使用服务器资源减少,对浏览者来说,的确能看到网页打开的速度加快。

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注