lamp升级php至php7

周末看了一下php7的一些情况,被其强大的性能吸引住,准备亲手升级一下php,让网站能够在php7下面跑起来,需要将服务器上的php升级到php7.0.0。

首先,简单的梳理一下,升级php实际上是对linux上的一个软件(类似编译器)的升级。但是和windows不同,linux上的编译安装不会覆盖原来的软件安装,除非完全覆盖原来的文件(覆盖原来的文件可能导致兼容性问题,其他软件在调用该软件时,可能不支持新版本的功能,新版本也可能不提供老版本的接口)。因此,在linux,我们可以并行运行多个版本的软件,我们同时在服务器上保存php5.6和运行php7.0。

其次,我们写的php程序要运行,只需要用php软件去执行源代码即可。但是apache要执行我们写的php,就必须调用一个模块来启用php软件执行。因此,我们升级php之后,也需要一个apache模块来让apache可以调用php7.0执行php程序。庆幸的是,在编译php7的时候,可以通过配置参数自动生成apache的libphp7.so,我们只需要修改apache的配置文件,就可以让apache从原来的调用php5切换到php7。

接下来,我们来安装php7。为方便演示,用root用户登陆到服务器。

下载解压

php官方下载页面,随便选择一个你的服务器所在国家的镜像,鼠标右键复制链接。

$ wget http://am1.php.net/get/php-7.0.0.tar.gz/from/this/mirror

解压下载到的压缩包

$ tar xf php-7.0.0.tar.gz
$cd php-7.0.0

安装前配置

解决依赖包

yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel

利用linux的make安装方式,我们需要在make之前对软件的编译进行配置。这里需要留意,如果编译之前没有配置对应的选项,会导致不生成某些模块,后面可能会遇到问题。

./configure --prefix=/usr/local/php7 \
--with-config-file-path=/usr/local/php7/etc \
--with-config-file-scan-dir=/usr/local/php7/etc/php.d \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-mcrypt=/usr/include \
--enable-mysqlnd \
--with-mysqli \
--with-pdo-mysql \
--with-gd \
--with-iconv \
--with-zlib \
--enable-xml \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-mbstring \
--enable-ftp \
--enable-gd-native-ttf \
--with-openssl \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--without-pear \
--with-gettext \
--enable-session \
--with-curl \
--with-jpeg-dir \
--with-freetype-dir \
--enable-opcache

上面的这段配置,蓝色选项根据你的服务器部署,修改成为你自己的实际路径。

编译安装

原本在linux中,在configure之后,只需要make就可以进行编译了,但是由于不同的环境,会出现不同的错误,比如我的服务器上,出现了提示libiconv错误,我在往上还看到libmcrypt错误。所以,在编译的时候,我们可能需要根据编译中出现的情况,安装对应的一些模块或软件环境。如果编译错误后无法继续编译,可以使用make clean再来编译。

我再编译的时候,出现了libiconv错误,同时,我们的服务器是双核的,所以,我用了下面的命令进行编译:

$ gmake -j2 ZEND_EXTRA_LIBS='-liconv'

-j2表示用双核cup去编译,编译速度更快。总之,编译中出现了什么错误,就到网上去查怎么解决。

完成编译之后,进行安装即可。

$ make install

配置apache

如果上面的编译安装正常,由于我们配置了apxs选项,所以在编译的时候,make会对apache的apxs进行调用操作,结果就是在apache的安装目录下的modules目录下生成libphp7.so,并在apache的配置文件httpd.conf中增加一行

LoadModule php7_module        modules/libphp7.so

一看就明白了,就是让apache去加载一个新的libphp7.so模块。但是我们仍然要对httpd.conf进行修改,重新配置apache。找到LoadModule php,你会发现,竟然出现了两行LoadModule,同时加载了php5和php7,如下:

LoadModule php5_module        modules/libphp5.so
LoadModule php7_module        modules/libphp7.so

我们把第一行给注释掉,而且还要增加一个PHPIniDir的配置项,即修改为如下:

#LoadModule php5_module        modules/libphp5.so
LoadModule php7_module        modules/libphp7.so
PHPIniDir   /usr/local/php7/etc

重启apache,现在可以写一个phpinfo去试试看了。

php的配置文件

在php默认安装状态下你可能发现  /usr/local/php7下没有etc目录,也就没有php.ini文件。这是正常的,不过你可以自己创建php.ini,也可以从php源码目录中找到两个php.ini-xxx文件,拷贝一个过去,改名为php.ini即可。

cd ~/php-7.0.0
mkdir /usr/local/php7/etc
cp php.ini-production /usr/local/php7/etc/php.ini

如果你的服务器上面还安装了mysql,其实不用再做其他配置,我们在configure的时候,让php7也支持mysql,如果你原来的lamp环境中已经可以正常连接mysql了,那么现在php7其实也可以正常连接mysql,mysql不需要做任何配置修改。

2015-12-07

已有9条评论
  1. […] 在《 lamp升级php至php7 》一文中,我谈到了如何在apache的服务器环境中升级php到7,而到nginx环境下,我们不再使用php的apxs模块,而是直接使用php-fpm模块。接下来,我们来尝试编译安装php7。 […]

  2. Paddington 2016-05-08 12:24

    你好,我现在有这样一个问题,服务器是Ubuntu,之前是lamp,其中有比较陈旧的5的一些项目在运行,而且暂时还不能将他们撤销(或升级)。所以,我想的是让php5和php7共同运行,即新部署(开发)的项目用php7,之前的那些老项目继续用php5。这样的话,我需要怎么做才能实现呢?希望您有空帮忙回答下,非常感谢。

    • frustigor 2016-05-08 22:25

      没有实践过多个PHP版本共存的情况,但是从理论上讲应该是可以的。PHP本身也就是一个执行程序,不同的版本可以共存于Linux系统,而主要要解决的是,当你访问网站时,如何让Apache去选择调用哪一个版本的PHP。我网上搜了一下,使用FastCGI可以实现这一目的,让不同的PHP版本占用不同的端口,在访问网站时,Apache将动态脚本处理交由FastCGI去选择,由FastCGI选择具体哪一个版本的PHP来执行脚本,执行完毕后,Apache直接返回结果。

  3. 蓝天 2016-09-08 13:57

    老师你好,向您请教些问题:
    小弟linux比较菜。不会make 编译安装php7 用的 sudo apt-get install php (mint 18)
    装完后在终端 php -v 可以运行。
    但是都不知道php7 装哪里了。
    用sudo find /etc -name “*php*” 命令发现
    etc/php/7.0 下面
    看到 /etc/rc4.d/s01php7.0 -fpm 这样的不知道什么
    还有/etc/alternatives/php 不知道什么
    /etc/cron.d/php 不知道什么

    其实我是想找他的配置文件。和扩展。 都没看到 php 的 ext 在哪
    更别说去执行phpize了。
    麻烦老师多写点教程分享下。百度的文章不多啊。

    • 否子戈 2016-09-12 09:25

      我可不是什么老师,随便称呼别人老师感觉不好
      你通过apt安装的软件,通过whereis php就可以看到相关路径

  4. […] 在《lamp升级php至php7》一文中,我谈到了如何在apache的服务器环境中升级php到7,而到nginx环境下,我们不再使用php的apxs模块,而是直接使用php-fpm模块。接下来,我们来尝试编译安装php7。 […]

  5. xiaocing 2017-02-05 03:13

    請教一下,我php7應該是升級成功(php -v 是顯示7.0)但是我打開phpmyadmin首頁𥚃php版本是顥示舊版5.538!這該如何?謝謝

    • 否子戈 2017-02-06 17:19

      升级php7成功并不代表你的Apache在用php7为你的程序提供服务,你得重新配置一下你的httpd,让httpd用php7来执行php程序。
      LoadModule php7_module modules/libphp7.so
      还有问题的话再留言。

  6. […] 在《lamp升级php至php7》一文中,我谈到了如何在apache的服务器环境中升级php到7,而到nginx环境下,我们不再使用php的apxs模块,而是直接使用php-fpm模块。接下来,我们来尝试编译安装php7。 […]