CentOS7 编译安装PHP7.3

程序人生
最近在CentOS源码编译安装了最新版的PHP7.3.5,安装过程中走了一些弯路,在此整理一份安装教程给需要的朋友,也给自己留个记录。

一、卸载旧版本PHP

如果安装有其它版本的PHP,需要卸载已有的PHP,重新安装

下面的命令是卸载不干净的

root@localhost[/]:$ yum remove php
正确卸载PHP的方法是删除php的rpm安装包,使用下面命令查看已安装的rpm软件包
root@localhost[/]:$ rpm -qa|grep php
提示如下
php-pdo-5.1.6-27.el5_5.3
php-mysql-5.1.6-27.el5_5.3
php-xml-5.1.6-27.el5_5.3
php-cli-5.1.6-27.el5_5.3
php-common-5.1.6-27.el5_5.3
卸载过程中会因存在依赖关系而报错,所以需要调整卸载的顺序,先卸载没有依赖的
root@localhost[/]:$ rpm -e php-pdo-5.1.6-27.el5_5.3
error: Failed dependencies:
        php-pdo is needed by (installed) php-mysql-5.1.6-27.el5_5.3.i386
如果调整了rpm包的卸载顺序,还是无法删除剩余的包,可以通过强制删除来解决:
root@localhost[/]:$ rpm -e xxx --nodeps  #其中xxx指的是rpm包名

二、安装PHP需要的依赖库

root@localhost[/]:$
yum install -y gcc gcc-c++ make zlib zlib-devel pcre pcre-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers

三、下载PHP7.3源码

#php官网下载
https://www.php.net/downloads.php

#命令行下载,把源码包保存在/usr/local目录下
root@localhost[/]:$ cd /usr/local
root@localhost[/usr/local]:$ wget https://www.php.net/distributions/php-7.3.5.tar.gz

四、解压源码包

root@localhost[/usr/local]:$ tar -zxvf php-7.3.5.tar.gz
root@localhost[/usr/local]:$ cd php-7.3.5

五、配置并编译安装

在这里最好把用到的模块统一编译安装(我第一次安装时只装了最基本的模块,后期其它模块单独编译时成功了,但是在加载.so文件时报错,试了N 种办法最后还是没解决,后来不得已又按照下面的配置项重新编译安装了一次)
更多配置选项说明
#配置php的安装信息,需要编译哪些模块大家自行配置
root@localhost[/usr/local/php-7.3.5]:$
./configure
--prefix=/usr/local/php \	#php安装的根目录
--exec-prefix=/usr/local/php \	#php执行文件所在目录
--bindir=/usr/local/php/bin \	#php/bin目录
--sbindir=/usr/local/php/sbin \	#php/sbin目录
--includedir=/usr/local/php/include \	#php包含文件所在目录
--libdir=/usr/local/php/lib/php \	#php/lib目录
--mandir=/usr/local/php/php/man \	#php/man目录
--with-config-file-path=/usr/local/php/etc \	#php的配置目录
--with-mysql-sock=/var/lib/mysql/mysql.sock \	#php的Unix socket通信文件
--with-mysqli=mysqlnd \    #php依赖mysql库
--with-pdo-mysql=mysqlnd \    #php依赖mysql库
--with-iconv-dir \    
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir \
--with-ldap=shared \
--with-gdbm \
--with-pear \
--with-gettext \
--with-curl \
--with-xmlrpc \
--with-openssl \
--with-mhash \
--with-gd \    #gd库
--enable-fpm \    #开启fpm
--enable-mysqlnd \
--enable-mysqlnd-compression-support \
--enable-xml \
--enable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-mbstring \
--enable-intl \
--enable-ftp \
--enable-gd-jis-conv \
--enable-pcntl \
--enable-sockets \
--enable-zip \
--enable-soap \
--enable-fileinfo \
--enable-opcache \
--enable-maintainer-zts \
以下方便复制粘贴
./configure
--prefix=/usr/local/php \
--exec-prefix=/usr/local/php \
--bindir=/usr/local/php/bin \
--sbindir=/usr/local/php/sbin \
--includedir=/usr/local/php/include \
--libdir=/usr/local/php/lib/php \
--mandir=/usr/local/php/php/man \
--with-config-file-path=/usr/local/php/etc \
--with-mysql-sock=/var/lib/mysql/mysql.sock \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-iconv-dir \    
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir \
--with-ldap=shared \
--with-gdbm \
--with-pear \
--with-gettext \
--with-curl \
--with-xmlrpc \
--with-openssl \
--with-mhash \
--with-gd \
--enable-fpm \
--enable-mysqlnd \
--enable-mysqlnd-compression-support \
--enable-xml \
--enable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-mbstring \
--enable-intl \
--enable-ftp \
--enable-gd-jis-conv \
--enable-pcntl \
--enable-sockets \
--enable-zip \
--enable-soap \
--enable-fileinfo \
--enable-opcache \
--enable-maintainer-zts \

不出意外的话,在配置过程中会报一些错误,可能出现的问题:
1、configure: WARNING: unrecognized options: --with-mcrypt, --with-libmbfl, --enable-gd-native-ttf
说明上面的配置参数已经弃用了,删除即可。

2、configure: error: DBA: Could not find necessary header file(s).
安装下 yum install gdbm-devel

3、configure: error: Cannot find ldap libraries in /usr/lib
拷贝下文件 cp -frp /usr/lib64/libldap* /usr/lib/

4、configure: error: off_t undefined; check your library configuration
进行如下操作:

root@localhost[/usr/local/php-7.3.5]:$
vim /etc/ld.so.conf
# 添加如下几行
/usr/local/lib64
/usr/local/lib
/usr/lib
/usr/lib64
# 保存退出
:wq
# 使之生效
root@localhost[/usr/local/php-7.3.5]:$ ldconfig -v
5、configure: error: Please reinstall the libzip distribution
#解决方法:
root@localhost[/usr/local/php-7.3.5]:$ wget https://nih.at/libzip/libzip-1.2.0.tar.gz
root@localhost[/usr/local/php-7.3.5]:$ tar -zxvf libzip-1.2.0.tar.gz
root@localhost[/usr/local/php-7.3.5]:$ cd libzip-1.2.0
root@localhost[/usr/local/php-7.3.5/libzip-1.2.0]:$
./configure
make && make install

......其它错误可参考PHP编译安装时常见错误解决办法,在此就不再一一说明了。
错误全部解决后,编译安装

root@localhost[/usr/local/php-7.3.5]:$ make && make install

六、配置php.ini文件与环境变量

在之前编译的源码包中,找到 php.ini-production,复制到/usr/local/php/etc下,并改名为php.ini
root@localhost[/usr/local/php-7.3.5]:$ cp php.ini-production /usr/local/php/etc/php.ini
添加php安装目录到系统环境变量
#创建并打开文件php.sh
root@localhost[/usr/local/php-7.3.5]:$ vim /etc/profile.d/php.sh
#添加如下内容:
export PATH=$PATH:/usr/local/php/bin/:/usr/local/php/sbin/
#保存并退出
:wq

七、配置php-fpm服务

将php源码编译目录下的 sapi/fpm/init.d.php-fpm 文件拷贝到系统配置 /etc/init.d 目录下并重命名为 php-fpm
root@localhost[/usr/local/php-7.3.5]:$ cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
root@localhost[/usr/local/php-7.3.5]:$ chmod +x /etc/init.d/php-fpm
将php安装目录下的 /usr/local/php/etc/php-fpm.conf.default 文件拷贝同目录下并重命名为 php-fpm.conf
root@localhost[/usr/local/php-7.3.5]:$ cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
将php安装目录下的 /usr/local/php/etc/php-fpm.d/www.conf.default 文件拷贝同目录下并重命名为 www.conf
root@localhost[/usr/local/php-7.3.5]:$ cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf 
使用source立即生效刚刚添加的php环境变量
root@localhost[/usr/local/php-7.3.5]:$ source /etc/profile.d/php.sh
启动php-fpm
root@localhost[/usr/local/php-7.3.5]:$ systemctl start php-fpm

#查看服务是否成功启动
root@localhost[/usr/local/php-7.3.5]:$ netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:139             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN
#有9000端口就是成功了
配置apapche让其支持php-fpm
检查/etc/httpd/conf.modules.d目录下的00-proxy.conf配置信息,要确保mod_proxy.so和mod_proxy_fcgi.so已被apache成功加载
#如果php-fpm使用的是TCP socket,那么在httpd.conf末尾加上:
<FilesMatch \.php$>
         SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

#如果用的是unix socket,那么httpd.conf末尾加上:
<Proxy "unix:/dev/shm/php-fpm.sock|fcgi://php-fpm">
    ProxySet disablereuse=off
</Proxy>

<FilesMatch \.php$>
    SetHandler proxy:fcgi://php-fpm
</FilesMatch>

设置php开机启动

#修改系统配置目录下的 php-fpm 文件可执行权限
root@localhost[/usr/local/php-7.3.5]:$ chmod +x /etc/init.d/php-fpm

#将系统配置目录下的 php-fpm 添加到 系统服务
root@localhost[/usr/local/php-7.3.5]:$ chkconfig --add php-fpm

#设置 `php-fpm 系统服务` 为开机启动
root@localhost[/usr/local/php-7.3.5]:$ chkconfig php-fpm on
查看PHP版本
root@localhost[/usr/local/php-7.3.5]:$ php -v
PHP 7.3.5 (cli) (built: May 23 2019 13:47:55) ( ZTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.5, Copyright (c) 1998-2018 Zend Technologies

至此,PHP已安装成功,并且是以php-fpm模式运行,并非我们常用的mod_php

php-fpm在性能上的提升还是很明显的,而且内存占用明显小于mod_php。


*         

正在加载验证码......