X

曜彤.手记

随记,关于互联网技术、产品与创业

LAMP 架构之升级 PHP 版本

当你看到这篇文章的时候 YHSPY.COM 服务器上的 PHP 版本已经从 5.4.27 升级到了 7.0.4,这是一个重大的飞跃。一路升级遇到了很多问题。官方声称 PHP7 最大的升级就是在语言性能上的提升,最大到达了30%。同时也去掉了很多老版本中被标记为 Deprecated 的函数方法,语言整体变得更加稳定。

首先声明,此文不适用于使用 yum 方式安装的 PHP 环境进行的升级,只适用于通过 PHP 源代码编译安装的 PHP 版本。升级之前首先需要判断服务器上的 Apache 版本,根据不同的 Apache 版本来参考不同的官方编译文档。用以下命令来查看当前已安装 Apache 的版本:

[root@iZ23ki8vt8tZ /]# httpd -v
Server version: Apache/2.2.27 (Unix)
Server built:   Jun 12 2014 21:19:24

由上述命令返回的结果可知,当前 Apache 服务器为“2.X”版本,所以此处应该参考官方给出的 PHP 在 Apache 版本2.X上的编译参考文档:Apache2.X 版本 PHP 编译文档。对于其他版本的 Aapche 或者 Nginx 服务器,可以参考此处:针对其他版本服务器的 PHP 编译文档

接下来我们从 PHP 官方给出的镜像地址来获取 PHP 源代码,这些源代码将会最后被编译并安装在我们的服务器上。这里按照官方文档的说明,我们使用 wget 命令来获取源代码的压缩包,并逐层解压,直到生成最后的源代码文件夹。

wget http://bg2.php.net/get/php-7.0.4.tar.gz/from/this/mirror  #从镜像获取 PHP 源代码;
gzip -d php-7.0.4.tar.gz  #解压缩;
tar -xf php-7.0.4.tar

由于我们这里为 PHP 的版本进行升级操作,所以需要保持新版本 PHP 源代码的预编译参数和旧版本 PHP 源码的预编译参数一致。进入到旧版本(当前版本)PHP 源码文件夹内,使用 vi/vim 命令打开文件夹内的 Makefile 文件,复制其中的 “CONFIGURE_COMMAND” 参数部分并整理(去掉单引号等)成如下格式:

CONFIGURE_COMMAND = ./configure --prefix=/alidata/server/php --with-config-file-path=/alidata/server/php/etc --with-apxs2=/alidata/server/httpd/bin/apxs --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-static --enable-maintainer-zts --enable-zend-multibyte --enable-inline-optimization --enable-sockets --enable-wddx --enable-zip --enable-calendar --enable-bcmath --enable-soap --with-zlib --with-iconv-dir=/usr/local/libiconv --with-gd --with-xmlrpc --enable-mbstring --without-sqlite --with-curl --enable-ftp --with-mcrypt --with-freetype-dir=/usr/local/freetype.2.1.10 --with-jpeg-dir=/usr/local/jpeg.6 --with-png-dir=/usr/local/libpng.1.2.50 --disable-ipv6 --disable-fileinfo --with-openssl --with-pcntl

这里 CONFIGURE_COMMAND 参数的值就是对应于我们上一次 PHP 源码预编译过程的全部编译命令(和子参数),这里顺便说一下其中几个子参数的作用。 --prefix 参数用来指定 PHP 安装的主要目录位置,--with-config-file-path 参数主要用来指定 “php.ini” 文件的生成路径,对于其他子参数的具体用法和说明,可以在 PHP 源代码文件夹内使用 ./configure --help 命令来进行查看。

接下来便通过已经整理好的预编译参数来对源码进行预编译(即编译前的配置操作)操作,命令如下:

./configure --prefix=/alidata/server/php --with-config-file-path=/alidata/server/php/etc --with-apxs2=/alidata/server/httpd/bin/apxs --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-static --enable-maintainer-zts --enable-zend-multibyte --enable-inline-optimization --enable-sockets --enable-wddx --enable-zip --enable-calendar --enable-bcmath --enable-soap --with-zlib --with-iconv-dir=/usr/local/libiconv --with-gd --with-xmlrpc --enable-mbstring --without-sqlite --with-curl --enable-ftp --with-mcrypt --with-freetype-dir=/usr/local/freetype.2.1.10 --with-jpeg-dir=/usr/local/jpeg.6 --with-png-dir=/usr/local/libpng.1.2.50 --disable-ipv6 --disable-fileinfo --with-openssl --with-pcntl

在这里为了防止出现错误,我们需要分开执行 make 编译和 make install 安装两个操作命令,首先执行 make 命令来编译源代码。

make

如果在执行过程中遇到 “undefined reference to “libiconv””错误,请尝试为 make 命令加入 “ZEND_EXTRA_LIBS” 参数,如下所示:

make ZEND_EXTRA_LIBS='-liconv'

最后再执行 make install 命令来安装 PHP 环境:

make install

当源代码全部编译完成并安装后,便可以用以下命令来重新启动 Apache 服务器:

service httpd restart

至此,PHP7 的升级就全部结束了,你可以通过 phpinfo() 函数来查看新版本 PHP 的相关配置,包括扩展配置和错误日志等常用设置是否配置正确。从 PHP5.X 升级至 PHP7.X 后,一些 PHP 在早期版本不推荐使用的函数比如 split() 等都已经从 PHP7 中被移除了,所以在升级时务必请参考官方的升级文档。并且,PHP7 也移除了 mysql 相关的函数,因此只能够使用 PDO 或其他方式来连接数据库。

写在最后,其实所谓的预编译步骤是对源代码编译之前进行一些环境配置,比如指定编译是否携带某一模块,编译生成的文件夹等。同时在执行 ./configure 时也会同时生成 Makefile 文件。




评论 | Comments


Loading ...