编译安装php7.4 版本

一直都用运维工具,处理多个版本环境的问题。如php,pythone,go等 ,在不同项目中需求也不一样,所以在一台服务器中会安装多个编译器,正常一台全新的服务器一般都会安装运维工具,如 宝塔
可以可视化的,傻瓜式的安装环境,编辑环境变量等一系列操作。这样也导致一个问题,在一些使用很久的服务器中,你没法安装宝塔运维工具,在不同项目中你使用的环境就不同,要手动编译安装,设定端口,环境内容设定等等,一旦遇到就是两眼一黑。 懒猫今天也遇到这样的问题,在一个项目中需要安装php7.4环境,是在一台很老的服务器,里面都是一些php5,php6,nginx配置也是乱七八糟,但还是要安装php7.4环境。

唯一值得庆幸的是 这台服务器是contentOs7 以上版本。7以下是没发使用yum安装。

当然懒猫使用的是编译安装。

安装过程

  1. 下载PHP源码包
    在服务器上确定你要编译的安装目录如: /www/serve/\
1
2
cd /www/serve/
wget https://www.php.net/distributions/php-7.4.30.tar.gz
  1. 解压
1
tar xf php-7.4.30.tar.gz -C /www/serve/
  1. 预编译、检查环境

–prefix= : 是要编译到那个目录下,懒猫指定的是 /www/serve/php74
–with-config-file-path= : 编译完成后选择自己需要的 php.ini 文件 复制到 –with-config-file-path 指定的目录。 如果没有指定–with-config-file-path选项,PHP可能不知道在哪里查找php.ini文件。

其他都是安装扩展等

1
2
3
4
5
#进入到解压的目录中 /www/serve/php-7.4.30 
cd /www/serve/php-7.4.30
#再执行 以下命令
./configure --prefix=/www/serve/php74 --with-config-file-path=/usr/local/php/etc --with-mysqli --with-pdo-mysql --with-mysql-sock=/usr/local/mysql/mysql.sock --with-iconv-dir --with-freetype-dir --with-jpeg-dir --with-png-dir --with-curl --with-gd --with-gmp --with-zlib --with-xmlrpc --with-openssl --without-pear --with-snmp --with-gettext --with-mhash --with-libxml-dir=/usr --with-ldap --with-ldap-sasl --with-fpm-user=nginx --with-fpm-group=nginx --enable-xml --enable-fpm --enable-ftp --enable-bcmath --enable-soap --enable-shmop --enable-sysvsem --enable-sockets --enable-inline-optimization --enable-maintainer-zts --enable-mbregex --enable-mbstring --enable-pcntl --enable-zip --disable-fileinfo --disable-rpath --enable-libxml --enable-opcache --enable-mysqlnd

等待。。。

如果出现以下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
出现的错误

configure: error: Package requirements (libxml-2.0 >= 2.7.6) were not met:

解决方法:
yum install libxml2-devel -y
configure: error: Package requirements (openssl >= 1.0.1) were not met:

解决方法:
yum install openssl-devel -y
configure: error: Package requirements (sqlite3 > 3.7.4) were not met:

解决方法:
yum install sqlite-devel -y
configure: error: Package requirements (libcurl >= 7.15.5) were not met:

解决方法:
yum install libcurl-devel -y
configure: error: GNU MP Library version 4.2 or greater required.

解决方法:
yum -y install gmp-devel -y
configure: error: Cannot find ldap.h

解决方法:
yum install openldap openldap-devel -y
configure: error: Cannot find ldap libraries in /usr/lib.

解决方法:
cp -frp /usr/lib64/libldap* /usr/lib/
configure: error: Package requirements (oniguruma) were not met:

解决方法:
yum install oniguruma-devel -y
configure: error: Could not find net-snmp-config binary. Please check your net-snmp installation.

解决方法:
yum install net-snmp-devel -y

  1. 编译并安装
1
make & make install

出现的错误

cc: fatal error: Killed signal terminated program cc1
compilation terminated.

解决方法:

1
2
3
4
5
6
mkdir -p /var/cache/swap/
dd if=/dev/zero of=/var/cache/swap/swap0 bs=10M count=400
chmod 0600 /var/cache/swap/swap0
mkswap /var/cache/swap/swap0
swapon /var/cache/swap/swap0
swapon -s

/usr/bin/ld: ext/ldap/.libs/ldap.o: undefined reference to symbol ‘ber_strdup’
//usr/lib64/liblber-2.4.so.2: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [Makefile:287: sapi/cli/php] Error 1

解决方法:

1
2
3
4
vim Makefile
#在以EXTRA_LIBS开头的一行结尾添加‘-llber’,如下:

EXTRA_LIBS = -lcrypt -lresolv -lcrypt -lrt -lldap -lgmp -lrt -lm -ldl -lpthread -lxml2 -lssl -lcrypto -lsqlite3 -lz -lcurl -lxml2 -lssl -lcrypto -lonig -lsqlite3 -lxml2 -lnetsnmp -lm -lssl -lssl -lcrypto -lxml2 -lcrypt -lxml2 -lxml2 -lxml2 -lxml2 -lz -lssl -lcrypto -lcrypt -llber

如果编译直接成功,你就会发现在 /www/serve/php74 目录下生成了很多文件!!

  1. 配置php配置文件
1
2
3
4
#移动php配置文件的位置,并修改名称
cp /www/serve/php-7.4.30/etc/php-fpm.d/www.conf.default /www/serve/php74/etc/php-fpm.conf
#复制php.ini文件
cp /www/serve/php-7.4.30/php.ini-production /www/serve/php74/etc/php.ini
  1. 复制php启动脚本到/etc/init.d/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
##复制启动项到运行目录下
cp /www/serve/php-7.4.30/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm-74
chmod +x /etc/init.d/php-fpm-74

## 将 php-fpm-74 这个服务添加到 chkconfig 的管理列表中,这样你就可以使用 chkconfig 命令来管理这个服务的启动和停止行为了
chkconfig --add php-fpm-74

## 命令的作用是将 php-fpm-74 服务设置为在系统启动时自动启动
chkconfig php-fpm-74 on

##启动php7.4环境
/etc/init.d/php-fpm-74 start

##查看运行状况
systemctl status php-fpm.service

## 查看php进程
ps aux|grep php

相关配置处理

设定运行php7.4指定端口

当运行php7.4 环境时,发现很多端口被其他版本环境占用,这时就需要设定php7.4使用其他端口。配置如下

访问到 /www/serve/php74/etc/php-fpm.conf 文件中 【注意这里是我之前 cp 过来的文件,具体可以看上文】

1
2
3
4
5
6
7
vi  /www/serve/php74/etc/php-fpm.conf
##找到 listen 其中 默认指向 9000端口 listen = 127.0.0.0:9000
## 当前我要修改我 9003端口

listen = 127.0.0.0:9003

## wq!保存

重启php7.4环境即可

1
/etc/init.d/php-fpm-74 restart 

nginx 域名配置

这时nginx配置要指定域名访问的项目目录使用php7.4那该如何配置指向呢?如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
server {
listen 80; #监听的端口,默认都是80
server_name demo.xxxx.com; #网址域名 都需要提前解析服务器ip上

index index.php index.html index.htm default.php default.htm default.html; #默认访问优先级
root /xxxx/xxxxx/server/public; #运行访问项目目录路径

location / {
index index.html index.htm index.php;
if (!-e $request_filename)
{
rewrite ^/(.*)$ /index.php?s=$1 last;
break;
}
}
location ~ /.*\.php/ {
rewrite ^(.*?/?)(.*\.php)(.*)$ /$2?s=$3 last;
break;
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9003; ##在上文中懒猫改了php7.4的端口道9003 所以服务器访问9003端口就是在调用php7.4
fastcgi_index index.php;
##fastcgi_param: 这是一个 Nginx 指令,用于设置 FastCGI 参数。
##SCRIPT_FILENAME: 这是一个 FastCGI 参数名,用于告诉 FastCGI 进程(如 PHP)当前正在处理的脚本的完整路径。
##$document_root: 这是一个 Nginx 变量,代表当前请求的根目录。通常,这是 Nginx 配置中 root 指令指定的值。
##$fastcgi_script_name: 这也是一个 Nginx 变量,代表 FastCGI 脚本的名称(通常是请求的路径)。
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}


location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}


##错误日志记录
error_page 404 /include/404.shtml;
error_log /xxx/xxx/xxxx.com_error.log;
access_log /xxx/xxx/xxxx.com_access.log combined;
}

如何设定php7.4相关参数

这时就要修改对应的php.ini,重上文我们已经复制php.ini文件
cp /www/serve/php-7.4.30/php.ini-production /www/serve/php74/etc/php.ini
所以 只要修改 /www/serve/php74/etc/php.ini 文件,修改相关参数,如上传配置,内存设定,运行时长等

设置完毕后,需要重启 php7.4 环境,让其修改配置生效。/etc/init.d/php-fpm-74 restart
同时也重启下nginx service nginx restart 即可

如果是要看其他环境下对应php.ini

可以查看 phpinfo();

1
2
Configuration File (php.ini) Path	 => 这里会说明php.ini的路径
Loaded Configuration File => 这里会显示是否价值了php.ini

在编译安装 PHP 7.4 后,要安装扩展

按照以下步骤进行操作:

进入 PHP 解压缩后的源码包目录。在该目录中,你将找到要安装的扩展模块的目录。
进入要安装的扩展模块的目录。例如,如果你要安装 mbstring 扩展,你可以进入 php-7.4.x/ext/mbstring 目录(其中 x 是具体的版本号)。
使用 phpize 工具准备扩展模块的编译环境。phpize 是 PHP 提供的一个用于动态添加扩展的工具。你可以通过运行以下命令来调用 phpize:

1
/path/to/phpize

请确保将 /path/to/phpize 替换为实际的 phpize 可执行文件路径。你可以使用 whereis phpize 或 find / -name phpize 命令来查找 phpize 的路径。

  1. 运行 configure 脚本以配置扩展模块的编译选项。该脚本将检查你的系统环境和依赖项,并生成 Makefile 文件。你可以使用以下命令来运行 configure 脚本:
1
./configure --with-php-config=/path/to/php-config

请将 /path/to/php-config 替换为实际的 php-config 可执行文件路径。你可以使用 whereis php-config 或 find / -name php-config 命令来查找 php-config 的路径。

  1. 编译和安装扩展模块。使用以下命令来编译和安装扩展模块:
1
2
make  
sudo make install

这将编译扩展模块并将其安装到适当的位置。

  1. 修改 php.ini 文件以启用扩展模块。找到 php.ini 文件(通常位于 PHP 安装目录的 lib 子目录中),然后添加以下两行内容:
1
2
extension_dir = "/path/to/extension_dir"  
extension=extension_name.so

将 /path/to/extension_dir 替换为实际的扩展模块目录路径,将 extension_name.so 替换为你要启用的扩展模块的文件名(例如,mbstring.so)。

  1. 重启你的 Web 服务器或 PHP-FPM 进程,以使更改生效。
    请注意,上述步骤中的路径和文件名可能因你的系统和安装方式而有所不同。确保根据实际情况进行适当的替换和调整。
    此外,如果你使用的是包管理器(如 apt 或 yum)来安装 PHP,你可以使用包管理器来安装和管理扩展模块,这样会更方便和简单。具体的命令和步骤可能会因你使用的操作系统和包管理器而有所不同。