编译安装php8.4.10(2025.7更新) 以下操作在debian12(deb系-debian\ubuntu)和rocky9.2(red hat系-centos\rocky linux\oracle linux)都测试过 仅限linux系统

在全文的最后,我写了bash脚本(只支持deb系),可以参考,直接运行bash脚本一键编译安装

1.下载并解压源码包

php官方下载页面 在/usr/local目录下操作

cd /usr/local

下载源码包

wget https://www.php.net/distributions/php-8.4.10.tar.gz

解压并进入目录

tar -zxvf php-8.4.10.tar.gz && cd php-8.4.10

2.安装依赖

依赖是根据开启的扩展决定的,以下的拓展是常用的,编译安装的好处之一,就是如果缺少拓展也很容易自行安装。 1)deb系列

apt-get install build-essential autoconf automake libtool libsqlite3-dev pkg-config libjpeg-dev libpng-dev libxml2-dev libbz2-dev libcurl4-gnutls-dev libssl-dev libffi-dev libwebp-dev libonig-dev libzip-dev

2)redhat系列

redhat系由于包不全(deb系好用啊),如果遇到找不到的包,可以在 pkgs.org中查找

dnf -y groupinstall 'Development Tools'

dnf -y install wget libxml2-devel sqlite-devel bzip2-devel libcurl-devel libffi-devel libpng-devel libwebp-devel libjpeg-devel oniguruma libzip

安装 oniguruma

wget https://dl.rockylinux.org/pub/rocky/9/devel/x86_64/os/Packages/o/oniguruma-devel-6.9.6-1.el9.5.x86_64.rpm

dnf -y install oniguruma-devel-6.9.6-1.el9.5.x86_64.rpm

安装libzip-devel

wget https://dl.rockylinux.org/pub/rocky/9/devel/x86_64/os/Packages/l/libzip-devel-1.7.3-7.el9.x86_64.rpm

dnf -y install libzip-devel-1.7.3-7.el9.x86_64.rpm

3.编译安装

查看编译参数(可跳过,如果你不知道参数的作用)

./configure -help

编译参数如下:

./configure --prefix=/usr/local/php --sysconfdir=/etc/php --with-openssl --with-zlib --with-bz2 --with-curl --enable-bcmath --enable-gd --with-webp --with-jpeg --with-mhash --enable-mbstring --with-mysqli --enable-exif --with-ffi --with-zip --enable-sockets --with-pcre-jit --enable-fpm --with-pdo-mysql --enable-pcntl

上面的展开说明(使用的话直接复制上面的,这里是做解释用的)

./configure

--prefix=/usr/local/php #安装地址

--sysconfdir=/etc/php #设置文件地址

--with-openssl #启用ssl

--with-zlib

--with-bz2

--with-curl #启用curl(必开)

--enable-bcmath

--enable-gd

--with-webp

--with-jpeg

--with-mhash

--enable-mbstring #必开,很多需要用到

--with-mysqli #mysqli函数,如果用pdo,可以补开

--enable-exif

--with-ffi #支持外挂C程序

--with-zip

--enable-sockets #开启socket

--with-pcre-jit #开启jit

--enable-fpm #开启fpm模式(必开)

--with-pdo-mysql #支持mysql

--with-pdo-pgsql #支持pgsql

--enable-pcntl

显示如下的提示,说明可以继续安装了 编译安装,安装时间比较长,请耐心等待!

make && make install

编译完成后会显示类似如下信息: 里面包含了各种文件的地址,建议编译后截图保存,方便日后查看

4.添加系统用户

添加用户组,名字用www是因为通常php做web后端开发的,可以改成别的。

groupadd www

添加用户(一个不允许登录的用户)

useradd -g www -s /sbin/nologin www

5.配置

将配置文件复制到正确的位置(很多情况下修改配置不生效就是配置文件地址没搞对)

cp /usr/local/php-8.4.10/php.ini-development /usr/local/php/lib/php.ini

cp /etc/php/php-fpm.conf.default /etc/php/php-fpm.conf

cp /etc/php/php-fpm.d/www.conf.default /etc/php/php-fpm.d/www.conf

6.配置环境变量

vi /etc/profile

在PATH中添加,和其它的目录用:分隔开(如果找不到PATH,用第二种方式)

/usr/local/php/bin

第一种方式:类似如下(写的详细些,一些新手对环境变量理解不够) 第二种方式:直接在文件的最下面加入下面

export PATH=$PATH:/usr/local/php/bin

保存退出后,在命令行刷新环境变量

source /etc/profile

输入以下命令,如果能够返回版本号,说明配置成功

php -v

正确返回如下的信息

7.配置php

修改默认session位置 创建session地址(也可以写成别的)

mkdir /usr/local/php/tmp && chmod -R 755 /usr/local/php/tmp

修改php.ini

vi /usr/local/php/lib/php.ini

找到session.save_path,修改后面内容为"/usr/local/php/tmp"(原本是“/tmp”) 找到expose_php = On;,修改On为Off。这个修改是在响应头中隐藏php信息。否则在响应头的X-Powered-By中会显示php版本(尽量不要让入侵者获取更多的信息)

修改默认open_basedir 允许php访问的地址,可以在php配置,也可以在nginx配置(如果两者都配置了,以php为主)

vi /usr/local/php/lib/php.ini

找到open_basedir,然后添加需要的目录

配置php-fpm

vi /etc/php/php-fpm.d/www.conf

修改user=www,group=www(原本都是nobody)

配置日志地址 php默认是开启直接打印错误,但是默认不会生成错误日志,个人建议是开启,不过也建议使用日志管理工具定期分割清理日志。 找到php_error.log,可以修改成下面,记得去新建文件夹,授予755以上权限,我个人习惯放到/var/log目录下,根据自己习惯修改。如果不需要这个可以省去这个配置。 修改为php_error.log=/var/log/php/error.log

8.systemctl管理(php-fpm)

创建脚本文件

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

内容如下

[Unit]

Description=php-fpm

After=syslog.target network.target

[Service]

Type=forking

ExecStart=/usr/local/php/sbin/php-fpm

ExecReload=/bin/kill -USR2 $MAINPID

PrivateTmp=true

[Install]

WantedBy=multi-user.target

刷新systemctl

systemctl daemon-reload

开启、开机启动

systemctl start php-fpm && systemctl enable php-fpm && systemctl status php-fpm

至此php编译安装和php-fpm的启动就完成了 注意:php有两种常见的运行方式,apache和nginx的调用方式不同,nginx调用php-fpm。

9.常用的php基本命令

命令行下操作 查看配置文件的位置

php --ini

确定php cli安装了哪些拓展

php -m

10.php配置外部组件

陆续更新增加链接,包括但不限于以下 php配置nginx: php配置nginx

php增加redis拓展支持: php配置redis

php增加mongodb拓展支持:php配置mongodb

php增加rabbitmq拓展支持链接

composer使用:composer安装和使用

jit开启及配置: php开启jit

11.复制编译好的php到新设备

编译时间较长,而且如果内存只有1g(通常是云服务器),无法正常编译。 1)在新设备上安装依赖 2)将编译后的文件夹复制到新设备的相同位置(/usr/local/php) 3)将配置文件复制到新设备的相同位置(/etc/php) 4)配置环境变量 5)配置systemctl

12.可能的报错openssl

如果openssl报错,安装openssl3即可 openssl官网下载地址

cd /usr/local

wget https://www.openssl.org/source/openssl-3.0.12.tar.gz

tar -zxvf openssl-3.0.12.tar.gz && cd openssl-3.0.12

./config

make && make install

ldconfig /usr/local/lib64/

13.bash脚本一键编译安装(参考)

仅支持deb系,暂时不支持suse系edhat系,仅供参考。

创建文件

vi /usr/local/php8.sh

内容如下

#!/bin/bash

set -euo pipefail

# 常量设置

php_version="8.4.10"

install_path="/usr/local"

# 安装相关参数

php_config="/etc/php"

php_tarball="php-${php_version}.tar.gz"

php_src_dir="${install_path}/php-${php_version}"

php_prefix="${install_path}/php"

php_url="https://www.php.net/distributions/${php_tarball}"

# 安装依赖

echo "......正在安装依赖......"

apt-get update

apt-get install -y build-essential autoconf automake libtool libsqlite3-dev pkg-config \

libjpeg-dev libpng-dev libxml2-dev libbz2-dev libcurl4-gnutls-dev libssl-dev \

libffi-dev libwebp-dev libonig-dev libzip-dev

echo "......依赖安装完成......"

# 下载源码包

echo "......正在准备下载源码包......"

cd ${install_path}

if [ -f ${php_tarball} ]; then

echo "源码包已存在,跳过下载:${php_tarball}"

else

wget ${php_url}

echo "源码包下载完成"

fi

# 解压源码包

if [ -d ${php_src_dir} ]; then

echo "源码目录已存在,跳过解压:${php_src_dir}"

else

echo "......正在解压缩源码包......"

tar -zxf ${php_tarball}

echo "......源码包解压完成......"

fi

# 编译安装

echo "......正在编译安装......"

cd ${php_src_dir}

./configure --prefix=${php_prefix} --sysconfdir=/etc/php \

--with-openssl --with-zlib --with-bz2 --with-curl --enable-bcmath \

--enable-gd --with-webp --with-jpeg --with-mhash --enable-mbstring \

--with-imap-ssl --with-mysqli --enable-exif --with-ffi --with-zip \

--enable-sockets --with-pcre-jit --enable-fpm --with-pdo-mysql --enable-pcntl

make -j"$(nproc)"

make install

echo "......编译安装完成......"

# 添加用户和用户组

echo "......正在添加用户组和用户......"

if ! getent group www > /dev/null; then

groupadd www

fi

if ! id www > /dev/null 2>&1; then

useradd -g www -s /sbin/nologin www

fi

echo "......用户组和用户添加完成......"

# 配置文件复制

echo "......正在复制配置文件......"

cp ${php_src_dir}/php.ini-development ${php_prefix}/lib/php.ini

cp /etc/php/php-fpm.conf.default /etc/php/php-fpm.conf

cp /etc/php/php-fpm.d/www.conf.default /etc/php/php-fpm.d/www.conf

echo "......配置文件复制完成......"

# 配置环境变量

echo "......正在配置环境变量......"

profile_path="/etc/profile"

php_path_line="export PATH=\$PATH:${php_prefix}/bin"

if ! grep -q "${php_prefix}/bin" ${profile_path}; then

echo "${php_path_line}" >> ${profile_path}

source ${profile_path}

fi

echo "......环境变量配置完成......"

# php.ini 和 www.conf 修改

echo "......正在修改php配置文件......"

mkdir -p ${php_prefix}/tmp

chmod -R 755 ${php_prefix}/tmp

sed -i 's@;session.save_path = "/tmp"@session.save_path = "/usr/local/php/tmp"@' ${php_prefix}/lib/php.ini

sed -i 's/^user = .*/user = www/' /etc/php/php-fpm.d/www.conf

sed -i 's/^group = .*/group = www/' /etc/php/php-fpm.d/www.conf

echo "......php配置文件修改完成......"

# 配置 systemd 启动脚本

echo "......正在配置systemctl脚本......"

cat >/usr/lib/systemd/system/php-fpm.service <

[Unit]

Description=php-fpm

After=syslog.target network.target

[Service]

Type=forking

ExecStart=${php_prefix}/sbin/php-fpm

ExecReload=/bin/kill -USR2 \$MAINPID

PrivateTmp=true

[Install]

WantedBy=multi-user.target

EOF

systemctl daemon-reload

systemctl enable php-fpm

systemctl start php-fpm

systemctl status php-fpm

echo "......systemctl配置完成......"

echo "......!!!PHP ${php_version} 编译安装完成!!!......"

运行文件

chmod +x /usr/local/php8.sh

bash /usr/local/php8.sh