PHP 7找回MySQL扩展解决WordPress问题

PHP 7 使用 MySQL 的问题

最近将 VPS 上的博客程序都迁移到 Bluemix 容器上之后,运行起来倒还算稳定,前两天手贱将 Bluemix 系统上的 LNMP 环境更新到了 1.3 版本,顺带地把 PHP 也更新到 7.0.7 版本了,不过更新完成之后访问博客就碰到了 WordPress 报错:

您的 PHP 似乎没有安装运行 WordPress 所必需的 MySQL 扩展。

这才想起来 PHP 7 已经完全移除了 MySQL 扩展支持,通过 phpinfo 也能看到老的 mysql_ 系列的函数都不能使用了,一般建议使用新的 PHP mysqli 或者 pdo 扩展进行替换。

我的博客程序使用的还是 WordPress 3.6 版本,自然不支持 PHP 7,如果直接升级 WordPress 的话又要考虑一堆 WordPress 插件的兼容性问题,于是像我这么懒的人就考虑如何把 PHP 7 的 MySQL 扩展找回来了。

找回 PHP 7 的 MySQL 扩展

由于 PHP 7 只是在发布前将对 MySQL 扩展的支持移除掉了,这样我们就可以检出遗留版本的支持 MySQL 扩展的 PHP 7 代码自行编译安装了,不过需要注意的就是 MySQL 扩展可是完全没有后续更新的了。

我们可以首先看看 LNMP 环境里 PHP 7 自带的扩展:

root@instance-007a20ff:/home/lnmp1.3/src/php-7.0.7/ext# ls
bcmath      date      ext_skel_win32.php  gmp        json      mysqlnd  pcre          pdo_odbc    pspell      simplexml  sqlite3   tokenizer  xsl
bz2         dba       fileinfo            hash       ldap      oci8     pdo           pdo_pgsql   readline    skeleton   standard  wddx       zip
calendar    dom       filter              iconv      libxml    odbc     pdo_dblib     pdo_sqlite  recode      snmp       sysvmsg   xml        zlib
com_dotnet  enchant   ftp                 imap       mbstring  opcache  pdo_firebird  pgsql       reflection  soap       sysvsem   xmlreader
ctype       exif      gd                  interbase  mcrypt    openssl  pdo_mysql     phar        session     sockets    sysvshm   xmlrpc
curl        ext_skel  gettext             intl       mysqli    pcntl    pdo_oci       posix       shmop       spl        tidy      xmlwriter

MySQL 扩展确实已经被移除了,我们可以直接在 ext 目录下检出老的 PHP MySQL 扩展代码:

root@instance-007a20ff:/home/lnmp1.3/src/php-7.0.7/ext# git clone https://github.com/php/pecl-database-mysql mysql --recursive
Cloning into 'mysql'...
remote: Counting objects: 145, done.
remote: Total 145 (delta 0), reused 0 (delta 0), pack-reused 145
Receiving objects: 100% (145/145), 88.41 KiB | 0 bytes/s, done.
Resolving deltas: 100% (65/65), done.
Checking connectivity... done.

使用 phpize 准备编译:

root@instance-007a20ff:/home/lnmp1.3/src/php-7.0.7/ext# cd mysql
root@instance-007a20ff:/home/lnmp1.3/src/php-7.0.7/ext/mysql# ls
config.m4  config.w32  CREDITS  LICENSE  mysql.mak  mysql_mysqlnd.h  package.xml  php_mysql.c  php_mysql.h  php_mysql_structs.h  README.md  tests
root@instance-007a20ff:/home/lnmp1.3/src/php-7.0.7/ext/mysql# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version:         20151012
Zend Module Api No:      20151012
Zend Extension Api No:   320151012
root@instance-007a20ff:/home/lnmp1.3/src/php-7.0.7/ext/mysql# ./configure --with-php-config=/usr/local/php/bin/php-config

运行 make 编译之后 make install 确认 MySQL 扩展安装是否正确:

root@instance-007a20ff:/home/lnmp1.3/src/php-7.0.7/ext/mysql# make && make install
root@instance-007a20ff:~# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/
fileinfo.so  mysql.so  opcache.a  opcache.so

最后修改 php.ini 配置文件,增加一行:

extension = "mysql.so"

重新启动 LNMP 程序就能在 phpinfo 里看到 MySQL 扩展了:

PHP 7 下的 MySQL 扩展

此时再访问 WordPress 博客就没有问题了,PHP 7 的问题初步搞定。另外网上也有人是直接把老的 MySQL 扩展静态编译进 PHP 7 程序中,这样用起来也还算比较方便的。当然后面我肯定还是要找机会直接升级 WordPress 了,毕竟 PHP 7 带着有各种漏洞的 WordPress 3.6 实在有点浪费哈,最后祝大家玩的开心。





*