PHP是一种服务器端脚本语言,它需要在服务器上运行并由服务器解析。当客户端发送一个请求到服务器时,Web服务会接收到这个请求并将其传递给PHP解析器,然后PHP解析器会解析并执行PHP脚本,最后将结果返回给客户端。因此,PHP需要web服务来解析和执行PHP脚本。
在之前的文章中介绍了 Nginx+Apache环境 的编译安装,也是本次安装PHP环境的前置条件,我们需要使用Web服务来解析我们安装的PHP服务。
本次选择安装的PHP版本为7.4.33,PHP官方 已经停止维护PHP7,版本7.4.33也是PHP7的最后更新的一个版本。
由于之前配置Nginx+Apache环境的过程中已经安装过了gcc、pcre等编译依赖,这里就不重复安装。
但是我们仍需要手动安装oniguruma,它是一个处理正则表达式的库,本次过程中mbstring的正则表达式处理功能对这个包有依赖性,所以我们要先安装这个库。
国内yum源的安装版本过使得编译PHP的过程中出现版本过低的问题,需要手动安装。
#1.安装编译php的环境依赖
yum install libxml2-devel sqlite-devel curl-devel -y
#2.安装postgresql-devel(postgresql的lib库),否则无法安装psql的模块
yum install postgresql-devel -y
#3.下载oniguruma的tar包,并解压/opt/src目录
mkdir -p /opt/src && cd /opt/src
wget https://github.com/kkos/oniguruma/archive/v6.9.4.tar.gz -O oniguruma-6.9.4.tar.gz
tar xf oniguruma-6.9.4.tar.gz
#4.编译oniguruma程序
cd /opt/src/oniguruma-6.9.4/
./autogen.sh && ./configure --prefix=/usr
#5.构建oniguruma程序
make && make install
PHP7.4的扩展功能不支持动态编译添加,在PHP编译添加参数 --with-pdo-pgsql
,--with-pgsql
,--enable-mysqlnd
,--with-pdo-mysql
,--with-mysqli
来配置拓展,部分拓展编译依赖于开发工具。
Httpd通过PHP7编译参数 --with-apxs2
为Httpd服务安装 libphp7.so
模块实现对PHP文件的解析,配置路径为httpd服务的bin目录下apxs脚本,如:--with-apxs2=/opt/apps/httpd/bin/apxs
#1.下载php程序的tar包,解压至/opt/src目录。
wget https://www.php.net/distributions/php-7.4.33.tar.gz -P /opt/src
cd /opt/src && tar xf php-7.4.33.tar.gz
#2.编译php-7.4程序
cd /opt/src/php-7.4.33
./configure --prefix=/opt/apps/php \ #指定默认php的home目录
--with-config-file-path=/opt/apps/php/etc/ \ #指定默认php.ini文件存放的目录
--with-config-file-scan-dir=/opt/apps/php/etc/php.d \
--with-freetype \
--with-jpeg \
--with-zlib \
--with-curl \
--with-openssl \
--with-mhash \
--with-xmlrpc \
--with-iconv \
--without-pear \
--with-gettext \
--enable-gd \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-mbstring \
--enable-pcntl \
--enable-sockets \
--enable-soap \
--enable-xml \
--enable-inline-optimization \
--enable-mbregex \
--enable-fpm \
--enable-mysqlnd \
--with-mysqli \
--with-pdo-mysql \
--with-pdo-pgsql \
--with-pgsql \
--with-apxs2=/opt/apps/httpd/bin/apxs
#3.构建php-7.4程序
make -j4 && make install
#4.运行构建提示的libtool脚本,可能没有该提示
libtool --finish /opt/src/php-7.4.33/libs
#1.创建软链接管理PHP版本
cd /opt/apps/
mv php php-7.4.33
ln -s php-7.4.33 php
#2.拷贝php.ini文件
cp /opt/src/php-7.4.33/php.ini-production /opt/apps/php/etc/php.ini
#3.拷贝php-fpm.conf文件
cp /opt/apps/php/etc/{php-fpm.conf.default,php-fpm.conf}
#4.拷贝www.conf文件
cp /opt/apps/php/etc/php-fpm.d/{www.conf.default,www.conf}
#5.将php服务注册为系统服务
cat <<EOF > /usr/lib/systemd/system/php-fpm.service
[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target
[Service]
Type=simple
PIDFile=/opt/apps/php/var/run/php-fpm.pid
ExecStart=/opt/apps/php/sbin/php-fpm --nodaemonize --fpm-config /opt/apps/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 \$MAINPID
ExecStop=/bin/kill -SIGINT \$MAINPID
[Install]
WantedBy=multi-user.target
EOF
#6.重新加载系统服务
systemctl daemon-reload
#1.修改php.ini文件
sed -i -e 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /opt/apps/php/etc/php.ini
#2.修改php-fpm.conf文件,调整日志级别
sed -i -e 's/;log_level = notice/log_level = warning/g' /opt/apps/php/etc/php-fpm.conf
#4.修改www.conf文件,注意根据配置解析WEB的用户(这里配置用户是httpd解析)
tee > /opt/apps/php/etc/php-fpm.d/www.conf <<EOF
[www]
;user = nginx
;group = nginx
;listen.owner = nginx
;listen.group = nginx
user = httpd
group = apache
listen.owner = httpd
listen.group = apache
listen = var/run/php.cgi.sock
listen.backlog = -1
listen = 127.0.0.1:9000
listen.mode = 0660
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 20
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
slowlog = log/\$pool.log.slow
request_slowlog_timeout = 0
request_terminate_timeout = 100
EOF
vim /opt/apps/nginx/conf/conf.d/nginx.conf
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm index.php;
}
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;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#1.在httpd默认web目录下创建.php文件
tee > /opt/apps/nginx/html/phpinfo.php <<EOF
EOF
#2.关闭所有服务
systemctl stop php-fpm httpd nginx
#3.编辑php启动用户为nginx
vim /opt/apps/php/etc/php-fpm.d/www.conf
user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
#4.重新启动nginx和php服务
systemctl start php-fpm nginx
#5.访问phpinfo文件后,查看环境配置
访问链接:https://host-ip/phpinfo.php
#1.在httpd.conf文件中添加PHP解析
vim /opt/apps/httpd/conf/httpd.conf
#检查内容1:检查libphp7.so模块是否被注释
</IfModule>
LoadModule php7_module modules/libphp7.so
<IfModule unixd_module>
#修改内容2:修改默认目录的权限
<Directory />
AllowOverride none
Require all granted
</Directory>
#修改内容3:添加.php文件的识别
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
#修改内容4:添加应用类型x-httpd-php
#AddType application/x-compress .Z
#AddType application/x-gzip .gz .tgz
AddType application/x-httpd-php .php
#1.在httpd默认web目录下创建.php文件
tee > /opt/apps/httpd/htdocs/phpinfo.php <<EOF
EOF
#2.关闭所有服务
systemctl stop php-fpm httpd nginx
#3.编辑php启动用户为nginx
vim /opt/apps/php/etc/php-fpm.d/www.conf
user = httpd
group = apache
listen.owner = httpd
listen.group = apache
#4.重新启动httpd和php服务
systemctl start php-fpm httpd
#5.访问phpinfo文件后,查看环境配置
访问链接:https://host-ip/phpinfo.php
#1.安装mysqli.so扩展
cd /opt/src/php-7.4.33/ext/mysqli/
/opt/apps/php/bin/phpize
./configure --with-php-config=/opt/apps/php/bin/php-config --with-mysqli=mysqlnd
make -j4 && make install
#2.安装pdo_mysql.so扩展(可选)
cd /opt/src/php-7.4.33/ext/pdo_mysql/
/opt/apps/php/bin/phpize
./configure --with-php-config=/opt/apps/php/bin/php-config --with-pdo-mysql=mysqlnd
make -j4 && make install
#3.修改php.ini配置文件,取消mysqli.so扩展的注释
sed -i -e 's/;extension=mysqli/extension=mysqli/g' /opt/apps/php/etc/php.ini
sed -i -e 's/;extension=pdo_mysql/extension=pdo_mysql/g' /opt/apps/php/etc/php.ini
#4.修改php.ini配置文件,配置拓展模块的目录路径
extension_dir = "/opt/apps/php-7.4/lib/php/extensions/no-debug-non-zts-20190902/"
#1.安装pgsql.so扩展
cd /opt/src/php-7.4.33/ext/pgsql/
/opt/apps/php/bin/phpize
./configure --with-php-config=/opt/apps/php/bin/php-config --with-pgsql
make -j4 && make install
#2.安装pdo_pgsql.so扩展(可选)
cd /opt/src/php-7.4.33/ext/pdo_pgsql/
/opt/apps/php/bin/phpize
./configure --with-php-config=/opt/apps/php/bin/php-config --with-pdo-pgsql
make -j4 && make install
#3.修改php.ini配置文件,取消pgsql和pdo_pgsql扩展的注释
sed -i -e 's/;extension=pgsql/extension=pgsql/g' /opt/apps/php/etc/php.ini
sed -i -e 's/;extension=pdo_pgsql/extension=pdo_pgsql/g' /opt/apps/php/etc/php.ini
#4.修改php.ini配置文件,配置拓展模块的目录路径
extension_dir = "/opt/apps/php/lib/php/extensions/no-debug-non-zts-20190902/"
该模块安装时可能会出现的报错信息。
#编译错误1:configure: error: Cannot find ldap.h
#解决方法1:
yum install openldap-devel -y
#编译错误2:configure: error: Cannot find ldap libraries in /usr/lib
#解决方法2:
cp -frp /usr/lib64/libldap* /usr/lib/
若出现上述的报错信息,处理完后重新进行编译。
#1.生成ldap目录的编译环境
cd /opt/src/php-7.4.33/ext/ldap/
/opt/apps/php/bin/phpize
#2.编译并构建ldap模块
./configure --with-php-config=/opt/apps/php/bin/php-config --with-ldap
make -j4 && make install
#3.修改php.ini配置文件,取消ldap.so扩展的注释
sed -i -e 's/;extension=ldap/extension=ldap.so/g' /opt/apps/php/etc/php.ini
#4.修改php.ini配置文件,配置拓展模块的目录路径
extension_dir = "/opt/apps/php/lib/php/extensions/no-debug-non-zts-20190902/"
在web目录下创建一个php文件用于测试mysqli功能(mysql.php),写入下方的内容:
$host="192.168.233.10";
$user="user01";
$password="1234,abcd";
$port="3308";
$dbname="testdb";
//创建连接
@$conn=new mysqli($host,$user,$password,$dbname,$port);
//检测连接
if($conn->connect_errno){
die("数据库连接失败!提示:".$conn->connect_error);
}
echo "数据库连接成功!"
?>
在web目录下创建一个php文件用于测试pgsql功能(pgsql.php),写入下方的内容:
$host="192.168.233.10";
$user="postgres";
$password="1234,abcd";
$port="8432";
$dbname="postgres";
//创建连接
@$dbtest = pg_connect("host={$host} port={$port} dbname={$dbname} user={$user} password={$password}");
//检测连接
if (!$dbtest) {
echo "连接 PostgreSQL 数据库失败!";
} else {
echo "连接 PostgreSQL 数据库成功!";
pg_close($dbtest);
}
?>