2018 / 11 / 17
by John Yuan

从源码编译安装 PHP 7 及其扩展

本文记录如何在 linux (CentOS 7) 上从源码编译安装 PHP 7,并配置 PHP-FPM 和 Nginx 服务器,以及介绍如何通过源码编译安装 PHP 扩展。

前提

本文所使用系统为 Linux (CentOS 7),所有命令均在 root 用户下执行。并假定用户已事先将 Nginx 安装在以下目录:

/usr/local/nginx

如何安装 Nginx 请参考:Building nginx from Sources

安装 PHP 7

参考链接:PHP: Nginx 1.4.x on Unix systems

前往 http://php.net/downloads.php 页面下载需要安装的 PHP 版本。本文以 PHP 7.2.12 为例。

# 安装相关依赖
yum install gcc libxml2 libxml2-devel

# 使用 wget 下载源码
wget http://jp2.php.net/distributions/php-7.2.12.tar.gz

# 解压源代码
tar zxf php-7.2.12.tar.gz

# 进入源代码目录
cd php-7.2.12

# 运行 ./configure 脚本进行配置
# 默认的安装目录为 /usr/local,我们指定安装目录为 /opt/php7
# 提示:如果配置过程中抛错提示有依赖没有安装(假如依赖名为 xxx)
#      则使用 yum 安装该依赖及其开发包:yum install xxx xxx-devel
#      安装完成后再次运行 ./configure 即可。
# 备注:此处仅配置了 PHP-FPM 和 MySQLi,其他扩展可后期按需编译安装进去
./configure --prefix=/opt/php7 --enable-fpm --with-mysqli

# 配置完成后执行 make 命令进行编译(编译时间较长)
make

# 编译完成后使用以下命令进行安装
make install

# 复制配置文件
cp php.ini-development /opt/php7/lib/php.ini
# 修改配置文件,设置:cgi.fix_pathinfo=0
vim /opt/php7/lib/php.ini

# 复制 php-fpm 配置文件
# 首先进入 /opt/php7/etc 目录
cd /opt/php7/etc
cp php-fpm.conf.default php-fpm.conf
cp php-fpm.d/www.conf.default php-fpm.d/www.conf

# 启动 php-fpm
/opt/php7/sbin/php-fpm
# 提示 php-fpm 运行在 127.0.0.1:9000 详情请查看文件:
# cat /opt/php7/etc/php-fpm.d/www.conf

# 备注:停止或重启 php-fpm
# 首先找到 php-fpm 进程 id
ps aux | grep php-fpm
# 重启
kill -USR2 进程ID
# 停止
kill -INT 进程ID

配置 Nginx

此处以 php.example.com 为示例,编辑 Nginx 配置文件,添加一个 server:

server {
    listen 80;
    server_name php.example.com;

    root /srv/www/php.example.com;
    index index.php index.html index.htm;

    location ~* \.php$ {
        fastcgi_index   index.php;
        fastcgi_pass    127.0.0.1:9000;
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME     $fastcgi_script_name;
    }
}

重启 Nginx 服务器:

/usr/local/nginx/sbin/nginx -s reload

测试

在编写 Nginx 配置文件时,我们指定 php.example.com 的根目录为:

/srv/www/php.example.com

首先创建该目录:

mkdir -p /srv/www/php.example.com

然后,创建 test.php 文件:

echo "<?php phpinfo();" >> /srv/www/php.example.com/test.php

编辑本地 hosts 文件,将 php.example.com 指向 Nginx 所在服务器,然后访问以下链接以测试是否安装成功。

http://php.example.com/test.php

如果页面显示 PHP 版本信息则表明安装成功。

安装扩展

参考文档:

查看已安装的模块列表:

/opt/php7/bin/php -r 'print_r(get_loaded_extensions());'
# 或者以下命令
/opt/php7/bin/php -m

以下以安装 mbstring 模块为示例。首先进入 PHP 源代码 所在目录,然后执行以下命令:

# 安装 autoconf 依赖
yum install autoconf

# 所有扩展都保存在源码文件夹的 ext 目录下
# 我们进入 mbstring 扩展目录
cd ext/mbstring

# 执行 phpize 命令生成扩展构建环境
/opt/php7/bin/phpize

# 执行 ./configure 进行配置
./configure --with-php-config=/opt/php7/bin/php-config

# 编译扩展
make

# 安装扩展
make install

现在 mbstring 扩展已安装完成,需修改配置文件启用该扩展:

# 去除 ";extension=mbstring" 前面的分号 ";"
vim /opt/php7/lib/php.ini

重启 PHP-FPM:

# 查找 php-fpm 进程 id
ps aux | grep php-fpm
# 重启 php-fpm(请使用 master 进程 id)
kill -USR2 进程ID

再次查看已安装的 PHP 扩展即可看到 mbstring:

/opt/php7/bin/php -r 'print_r(get_loaded_extensions());'

其他扩展安装方式类似,可按自己的需要进行编译安装。

本文完。