CentOS源码编译安装PHP7.4.21

最后更新于:2023-04-14 11:12:51

1、依赖库安装

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

2、编译安装PHP7

tar zxvf php-7.4.21.tar.gz
cd php-php-7.4.21
./configure --prefix=/usr/local/php --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-zlib --with-curl --enable-gd --with-jpeg --with-libpng --with-freetype --with-openssl --enable-mbstring --enable-xml --enable-session --enable-ftp --enable-pdo -enable-tokenizer --with-zip


=========================老版本非7.4版本用下边的这个配置项 =========================

./configure --prefix=/usr/local/php --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-zlib --with-curl --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-openssl --enable-mbstring --enable-xml --enable-session --enable-ftp --enable-pdo -enable-tokenizer --enable-zip

============ ==================== ==错误提示 ============ ======================

①表示7.4版本这样用参数不对

configure: WARNING: unrecognized options: --with-gd, --with-jpeg-dir, --with-png-dir, --with-freetype-dir, --enable-zip

②No package 'sqlite3' found

解决办法

yum install sqlite-devel

③No package 'oniguruma' found

查阅

https://cyhour.com/1627/

在编译安装 PHP 7.4 时,如果使用 --with-mbstring 参数,则需要安装 oniguruma。

oniguruma 是一个处理正则表达式库,php7.4 中,mbstring 正则表达式处理功能对这个包有依赖。

所以,安装 php7.4 前需要安装 oniguruma 和 oniguruma-devel 两个软件包。

解决办法

yum -y install https://rpms.remirepo.net/enterprise/7/remi/x86_64/oniguruma5php-6.9.6-1.el7.remi.x86_64.rpm
yum -y install https://rpms.remirepo.net/enterprise/7/remi/x86_64/oniguruma5php-devel-6.9.6-1.el7.remi.x86_64.rpm

3、编译源文件

make && make install

4、增加用户组

groupadd www
useradd -M -g www -s /sbin/nologin www
-g:指定所属的group
-s:指定shell,因为它不需要登录,所以用/sbin/nologin
-M:不创建home目录,因为它不需要登录

5、拷贝及配置文件

cd /usr/local/php/etc/php-fpm.d/
cp www.conf.default www.conf
[www]
user = www
group = www
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 50

6、拷贝配置文件:

① php.ini

cd /usr/local/src/php-7.4.21
cp php.ini-production /usr/local/php/lib/php.ini

② php-fpm.conf

cd /usr/local/php/etc/
cp php-fpm.conf.default php-fpm.conf

③ php-fpm.service

cd /usr/local/src/php-7.4.21
cp sapi/fpm/php-fpm.service /usr/lib/systemd/system/

vim /usr/lib/systemd/system/php-fpm.service

修改成

ProtectSystem=false

现在可以用systemctl start php-fpm 的方式开启,与其他系统服务一样


7、配置nginx支持PHP

vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.abc.com;
location / {
index index.html index.php;
root /web/wwwdata;
}

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

重载配置文件

nginx -t
nginx -s reload

重启nginx

systemctl restart nginx


8、添加PHP测试页代码

方式一:测试PHP连接MySQL是否正常

cd /usr/local/nginx/html
vim mysqli.php

内容如下:【注意密码,代码别复制错了】

<?php
$conn = mysqli_connect('127.0.0.1', 'root', '123456', 'mysql');
if(!$conn){
die("数据库连接错误" . mysqli_connect_error());
}else{
echo"数据库连接成功";
}

方式二:测试PDO-mysql方式连接mysql数据库

cd /usr/local/nginx/html
vim mysqli.php

内容如下:【 注意密码,代码别复制错了 】

<?php
try{
$pdo=new pdo('mysql:host=127.0.0.1;dbname=mysql','root','mysqlabc123');
}catch(PDDException $e){
echo "数据库连接错误";
}
echo "数据库连接成功";
?>

========== ==================== ==错误提示 ============ ======================

CentOS 7编译安装PHP 7.4提示No package 'libzip' found或者(libzip >= 0.11)

解决办法:

#卸载老版本的libzip
yum remove libzip
#下载安装libzip-1.2.0
wget https://libzip.org/download/libzip-1.2.0.tar.gz
tar -zxvf libzip-1.2.0.tar.gz
cd libzip-1.2.0
./configure
make && make install


安装完成后,查看是否存在/usr/local/lib/pkgconfig目录,如果存在,执行如下命令来设置

PKG_CONFIG_PATH:
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/"

==========================【 PHP7.4的一些configure参数变更】=========================

查阅:

https://www.php.net/manual/zh/migration74.other-changes.php

==================================【 拓展阅读】=================================

with-pdo-mysql=mysqlnd
表示使用mysqlnd驱动,这里选项涉及两个概念,一个是pdo,另一个是mysqlnd.

PDO是PHP Data Objects的缩写,它是PHP应用中的一个数据库抽象层规范。PDO提供了一个统一的API接口可以使得PHP应用不用去关心具体要连接的数据库类型,也就是说,如果使用PDO的API,可以在任何需要的时候无缝切换数据库服务器,比如从Oracle到MySQL,仅仅需要修改很少的PHP代码。它的功能类似于JDBC、ODBC、DBI之类接口。因此,这里的"--with-pdo-mysql"就是PHP与MySQL进行连接的方式。

mysqlnd是mysql native driver的简写,它是由PHP官方提供的mysql驱动连接代码,它出现的目的是代替旧的libmysql驱动,而libmysql是mysql官方自带的mysql与php连接的驱动,从PHP5.3开始已经不推荐使用libmysql驱动,而建议使用mysqlnd,而在PHP7版本中,libmysql驱动已经被移除。

因此,在PHP7中,“--with-mysql=mysqlnd”的写法已经被废除。另外,由于mysqlnd内置于PHP源代码,因此在编译安装php时就不需要预先安装好mysql, 这将减化不少安装工作量。
--with-mysqli=mysqlnd

PHP-FPM是一个第三方的FastCGI进程管理器,最先它是作为PHP的一个补丁来开发的,现在PHP-FPM已经集成到了PHP源码中,在安装PHP的时候,通过指定“--enable-fpm”选项即可启用PHP-FPM功能。

PHP-FPM管理的进程包含master进程和worker进程两种。master进程只有一个,主要负责监听端口,接收来自Web Server的请求,而worker进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌了一个PHP解释器,是PHP代码真正执行的地方。

那么Nginx又是如何发送请求给PHP-FPM的呢,这就要从Nginx层面讲起了,我们知道,Nginx不仅仅是一个Web服务器,也是一个功能强大的代理服务器,除了进行http请求的代理,也可以进行许多其他协议请求的代理,包括本节介绍的与PHP-FPM相关的FastCGI协议。为了能够使Nginx理解FastCGI协议,Nginx提供了一个FastCGI模块来将http请求映射为对应的FastCGI请求,这样,Nginx就可以将请求发送给PHP-FPM了,也就实现了Nginx与PHP-FPM的集成。