PHP(Hypertext Preprocessor)即“超文本预处理器”,是在服务器端执行的脚本语言,适用于Web开发并可嵌入HTML中。
本文就来带大家自定义版本编译安装PHP。

  • 使用系统:CentOS 7.9.2009

libsodium库安装

本教程编译安装PHP时会使用到libsodium库为PHP提供更好的加密,故需一起编译安装,此处该库是采用编译安装方式(为后期方便自定义),也可使用yum命令安装该库,该库简介如下:

Sodium 是一个全新而且易用的加密库,用于加密、解密、签名和生成密码哈希等等。它是一个可移植的、跨编译器支持、可安装的,基于 NaCI 开发,提供了一个兼容 API 和一个提高更高可用性的扩展 API。它的目标是提供构建一个更高级的加密工具所需要的所有核心操作。Sodium 支持各种各样的编译器和操作系统,包括 Windows(如 MingW 或者 Visual Studio, x86 和 x64),iOS 和 Android。

libsodium访问官网:https://download.libsodium.org/libsodium/releases

1、下载libsodium库

wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.18-stable.tar.gz

2、解压缩

tar -zxf libsodium-1.0.18-stable.tar.gz

3、编译安装libsodium库

cd libsodium-stable
./configure --prefix=/usr/local/libsodium
make && make check
make install

PHP安装

此为编译安装自定义版本的PHP(文中安装的为PHP 7.3.26),若需要其他的安装版本可前往官方下载:https://www.php.net/downloads.php

本文PHP安装目录为:/usr/local/php/73,为方便后面多版本PHP共存,故后面部分操作都会加上73字样用于区分。

1、安装PHP所需依赖

yum -y install gcc openssl openssl-devel curl curl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel pcre pcre-devel libxslt libxslt-devel bzip2 bzip2-devel sqlite-devel libxml2 libxml2-devel libzip-devel glibc glibc-devel glib2 glib2-devel autoconf automake libtool libcurl.x86_64 libcurl-devel.x86_64 sqlite-devel.x86_64 wget gcc-c++ libicu-devel libzip libwebp libwebp-devel zlib zlib-devel ncurses ncurses-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers oniguruma oniguruma-devel

2、下载PHP源码包

cd ~
wget https://www.php.net/distributions/php-7.3.26.tar.gz

3、解压缩相关源码包

tar -zxvf php-7.3.26.tar.gz

4、编译安装

cd php-7.3.26

# 编译安装(注:此处的PHP用到的用户和用户组皆为www)
./configure --prefix=/usr/local/php/73 --enable-fpm --with-fpm-user=www \
 --with-fpm-group=www --enable-mysqlnd --with-mysqli=mysqlnd --enable-pdo \
 --with-pdo-mysql=mysqlnd --with-iconv-dir --with-jpeg-dir --with-png-dir \
 --with-zlib-dir --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem \
 --enable-inline-optimization --enable-mbregex --enable-mbstring --enable-intl \
 --enable-ftp --with-gd --with-mhash --enable-pcntl --enable-sockets \
 --with-xmlrpc --enable-soap --with-gettext --enable-opcache --with-curl \
 --with-openssl --with-gettext --with-webp-dir --with-freetype-dir \
 --with-libxml-dir --with-pear --with-sodium=/usr/local/libsodium --with-ldap \
 --with-ldap-sasl

make
make install

1)出现错误如下:

PHP configure: error: Cannot find ldap libraries in /usr/lib

这是在/usr/lib下找不到相关模块,这是因为64位的linux默认把openldap的so库文件都放在/usr/lib64文件夹下,可将/usr/lib64目录中所有ldap的so库拷贝到/usr/lib目录中,然后重新configure,命令如下:

cp -frp /usr/lib64/libldap* /usr/lib/

2)若make时报如下错误:

/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: * [sapi/cli/php] Error 1

这是因为在编译./configure ...的时候没抓好一些环境变数值。可在PHP源码目录下vim Makefile找到EXTRA_LIBS行,在该行添加-llber保存退出再次make即可,例如:EXTRA_LIBS = -lcrypt -llber -lresolv ………

5、添加软链接至系统环境变量

ln -s /usr/local/php/73/bin/php /usr/bin/php73

PHP相关配置

1、查看PHP基本信息并创建配置文件,将其复制到正确的位置

php73 -i | grep ini

查看PHP基本信息.png

复制文件

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

配置php-fpm

ln -s /usr/local/php/73/sbin/php-fpm /usr/sbin/php-fpm73

复制php配置文件目录下的php-fpm.conf.default,并重命名为php-fpm.conf

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

复制php配置文件目录下的php-fpm.d/www.conf.default,并重命名为php-fpm.d/www.conf

cp /usr/local/php/73/etc/php-fpm.d/www.conf.default /usr/local/php/73/etc/php-fpm.d/www.conf

2、编辑php-fpm.d/www.conf,设置 php-fpm 模块使用www用户和www用户组的身份运行。(此处看你web使用的是www还是www-data用户与用户组,并相应性配置)

vim /usr/local/php/73/etc/php-fpm.d/www.conf

#修改为如下:
user = www
group = www

创建一个www用户(若有可忽略,根据上方你修改的用户而创建)

useradd www

3、编辑php.ini,将文件中的配置项cgi.fix_pathinfo设为 0

为安全考虑,此处设置为0的原因见如下文章:

vim /usr/local/php/73/lib/php.ini

#修改为如下:
cgi.fix_pathinfo=0

4、编辑php-fpm.conf文件

vim /usr/local/php/73/etc/php-fpm.conf

#将以下两个取消注释
pid = run/php-fpm.pid
error_log = log/php-fpm.log

4、启动php-fpm

php-fpm73

5、配置 Nginx 使其支持 PHP 应用

vim /usr/local/nginx/conf/nginx.conf

#修改为:
server {

    #…………(这里为其他内容)

    location ~ [^/]\.php(/|$) {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        #增加 fastcgi_split_path_info指令,将URI匹配成PHP脚本的URI和pathinfo两个变量
        #即$fastcgi_script_name 和$fastcgi_path_info
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param   PATH_INFO $fastcgi_path_info;

        # 正则解析路径,使用set指令产生nginx变量并赋值
        set $real_script_name $fastcgi_script_name;
    
        # 正则匹配URI,若能匹配将产生两个子组
        if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
            #将两个子组赋值给刚生成的nginx变量
            set $real_script_name $1;
            set $path_info $2;
         }
     
        # 将可能匹配到的$path_info值通过fastcgi_param指令设置进去
        fastcgi_param   PATH_INFO $path_info;
    
        # 覆盖fastcgi_params文件中默认的SCRIPT_NAME配置项
        fastcgi_param   SCRIPT_NAME $real_script_name;
    
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        # 加载默认的fastcgi配置项
        include fastcgi_params;
    }
}

6、配置完后重启nginx

systemctl restart nginx

若在执行相关php文件时报No input file specified,可将root 放到location /上方,如下图:
修改错误.png

PHP设置自启动

1、去PHP源码目录,找到init.d.php-fpm文件,若不知道文件在哪儿可使用下述命令查找

find / -name init.d.php-fpm

#结果如下:
[root@yang fpm]# find / -name init.d.php-fpm
/root/php-7.3.26/sapi/fpm/init.d.php-fpm
[root@yang fpm]# 

2、将该文件复制到etc目录并重命名

cp /root/php-7.3.26/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm73

3、赋予脚本可执行命令,添加开机自启动

chmod +x /etc/init.d/php-fpm73
chkconfig --add php-fpm73
chkconfig php-fpm73 on

编译安装PHP扩展

由于PHP为编译安装,故安装模块拓展也需要相应的操作,在一开始克隆的源码里就有相应的PHP拓展模块(/root/php-7.3.26/ext目录下),此时我们可借助phpize来扩展php模块。此教程模拟安装PHP拓展mysqli为例。

1、添加phpize至系统环境变量

ln -s /usr/local/php/73/bin/phpize /usr/bin/phpize73

2、前往mysqli拓展目录下

cd /root/php-7.3.26/ext/mysqli

3、执行phpize

phpize73

此处若报错如下错误,是因为缺少了依赖包,安装相应的依赖即可,命令:yum install autoconf(现已添加至初步安装的依赖中)

Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

4、configure 配置编译参数

./configure --with-php-config=/usr/local/php/73/bin/php-config

5、编译安装

make
make install

make时若出现如下错误:

/root/php-7.3.26/ext/mysqli/php_mysqli_structs.h:40:33: fatal error: ext/mysqlnd/mysqlnd.h: No such file or directory

是因为php_mysqli_structs.h中第40行文件引用的路径错误,它是从相对路径ext加载库文件mysqlnd.h ,但是mysqli目录里没有ext,这块我们通过创建软链接的方式来解决:

ln -s /root/php-7.3.26/ext/ /root/php-7.3.26/ext/mysqli

6、查看是否添加成功

ll /usr/local/php/73/lib/php/extensions/no-debug-non-zts-20180731/

成功安装mysqli.png

已出现mysqli.so文件

7、编辑 php.ini,添加相关设置引用

vim /usr/local/php/73/lib/php.ini

#添加或修改为如下:
extension=mysqli

8、重新启动php

service php-fpm73 restart

若报错 Starting php-fpm [25-Jan-2021 20:07:38] ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98)

则是因为缺乏pid文件,解决方法为编辑配置文件,启用pid文件

vim /usr/local/php/73/etc/php-fpm.conf

#将下面的行取消注释:
pid = run/php-fpm.pid

此时若再重启失败,可使用命令ps -aux | grep php查看php进程,使用kill -9 [PID]将其结束其进程在重启即可

注:此时正常已加载mysqli模块,若遇到模块未加载,可能情况是您的php.ini文件未加载,在phpinfo页面查看显示Loaded Configuration File为none,那么可以修改下启动脚本里的配置文件使其启动时加载配置文件,如下:

vim /etc/init.d/php-fpm73

#  在这行命令上添加 指定的配置路径
php_opts="--fpm-config $php_fpm_CONF --pid $php_fpm_PID"
 
# 修改成
php_opts="--fpm-config $php_fpm_CONF -c ${prefix}/lib/php.ini --pid $php_fpm_PID"
End

本文标题:CentOS编译安装PHP

本文链接:https://www.isisy.com/963.html

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

声明:转载请注明文章来源。

如果觉得我的文章对你有用,请随意赞赏