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
复制文件
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 /上方,如下图:
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.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"