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