CentOS 7.6 安装 PHP 7.3.1

CentOS 7.6 安装 PHP 7.3.1

  • 安装 httpd
  • 安装 PHP
    • 前期准备
      • 确认系统版本
      • 下载 PHP 镜像
      • 新增用户组和用户
      • 安装依赖库包
    • 编译安装
      • 生成 Makefile 文件
      • 依赖错误
        • libzip 版本过低
        • off_t 未定义
        • 缺少 BZip2
        • 安装扩展 GD 报错
      • 编译
        • 成功编译
        • 编译错误
      • 安装
    • 复制配置文件
  • 配置 Apache
    • 关联 PHP
    • 配置解析 PHP
    • 修改 Web 路径
    • 问题
      • 问题 1 :403 禁止错误
      • 问题 2 :PHP 7.3.1 bug
      • 问题 3 :ThinkPHP5 权限异常
      • 问题 4 :ThinkPHP5 路由不解析

安装 httpd

为了将 ApachePHP 关联生成 libphp7.so 文件,需要在安装 PHP 之前安装 Apache

[root@localhost ~]# yum -y install httpd

另外需要安装 httpd-devel ,如果没有 httpd-devel ,在安装 PHP 时不会生成 libphp7.so 文件:

[root@localhost ~]# yum -y install httpd-devel

安装 PHP

前期准备

确认系统版本

查看 CentOS 版本信息

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

下载 PHP 镜像

获取源码并解压,wget -O 命令是将下载的文件重命名,可有可无:

[root@localhost ~]# wget -O php-7.3.1.tar.gz http://cn2.php.net/get/php-7.3.1.tar.gz/from/this/mirror
[root@localhost ~]# tar zxf php-7.3.1.tar.gz
[root@localhost ~]# cd php-7.3.1

如果上述地址不可用,可以更换为:http://php.net/distributions/php-7.3.1.tar.gz

新增用户组和用户

新增的用户组和用户是用于在编译时指定执行的用户组和用户:

[root@localhost php-7.3.1]# groupadd www
[root@localhost php-7.3.1]# useradd -g www www

安装依赖库包

安装 php 7.3.1 需要的一些依赖库包和一些其他依赖的扩展库:

[root@localhost php-7.3.1]# yum install -y autoconf automake libtool re2c libxml* openssl* BZip2* libcurl* libjpeg* libpng* libXpm* libzip* zlib* freetype* pcre* flex bison tar get

编译安装

生成 Makefile 文件

使用 Configure 脚本根据系统开发环境生成 Makefile 文件,其中 --with-fpm-user --with-fpm-group 分别指定了用户和用户组为 www ,而 --with-apxs2 指定 Apache 加载生成 libphp7.so

[root@localhost php-7.3.1]# ./configure --prefix=/usr/local/php7.3.1 --with-config-file-path=/usr/local/php7.3.1/etc --with-fpm-user=www --with-fpm-group=www --with-apxs2 --bindir=/usr/local/bin --sbindir=/user/local/sbin --enable-fpm --with-libxml-dir --enable-debug --with-zlib --disable-rpath --enable-sysvsem --with-curl --enable-mbregex --enable-mbstring --enable-zip --enable-soap --with-pear --disable-tokenizer --enable-ftp --with-mysqli --with-pdo-mysql --with-openssl --with-bz2 --with-jpeg-dir --with-webp-dir --with-png-dir --with-xpm-dir --with-freetype-dir --with-mhash --with-iconv-dir --enable-gd-jis-conv --with-gd --enable-sockets --with-pcre-dir --enable-bcmath --enable-pdo

依赖错误

在生成 Makefile 文件时可能会出现下列两个错误:

libzip 版本过低

如果出现下面的错误,表示当前的 libzip 版本过低,因为使用 yum 最新版只到 0.10,不足以达到要求,需要更新版本:

[root@localhost php-7.3.1]# ./configure ......
checking for ...
...
checking for libzip... configure: error: system libzip must be upgraded to version >= 0.11

更新 libzip
先删除旧版本的 libzip 然后手动下载源码编译安装:

[root@localhost php-7.3.1]# yum remove -y libzip
[root@localhost php-7.3.1]# wget https://nih.at/libzip/libzip-1.2.0.tar.gz
[root@localhost php-7.3.1]# tar -zxvf libzip-1.2.0.tar.gz
[root@localhost php-7.3.1]# ./configure
[root@localhost php-7.3.1]# make && make install

off_t 未定义

如果出现未定义的类型 off_t 错误的话,off_t 类型是在头文件 unistd.h 中定义的,在 32 位系统编译成 long int,64 位系统则编译成 long long int,在进行编译的时候默认查找 64 位的动态链接库,但是默认情况下 CentOS 的动态链接库配置文件 /etc/ld.so.conf 没有加入搜索路径,所以需要将 /usr/local/lib64/usr/lib64 这些针对 64 位的库文件路径加进去:

[root@localhost php-7.3.1]# ./configure ......
checking for ...
...
checking size of off_t... 0
configure: error: off_t undefined; check your library configuration

添加路径
先将搜索路径添加进配置文件,然后更新配置(其中 ldconfig -v 是用来更新 ld 的缓存文件 ld.so.cache , 缓存文件的目的是记录动态编译库文件的路径,加快二进制文件运行时的速度):

[root@localhost php-7.3.1]# echo '/usr/local/lib64
/usr/local/lib
/usr/lib
/usr/lib64'>>/etc/ld.so.conf
[root@localhost php-7.3.1]# ldconfig -v

缺少 BZip2

如果出现提示需要重装 BZip2 ,需要安装 bzip2bzip2-devel

configure: error: Please reinstall the BZip2 distribution

解决方式:

[root@localhost php-7.3.1]# yum install -y bzip2 bzip2-devel

安装扩展 GD 报错

如果在安装 GD 时出现提示缺少 webp/decode.h ,需要安装 libwebplibwebp-devel

checking whether to enable JIS-mapped Japanese font support in GD... yes
configure: error: webp/decode.h not found.

解决方式:

[root@localhost php-7.3.1]# yum install -y libwebp libwebp-devel

编译

成功编译

成功生成 Makefile 文件后就可以用 make 命令进行编译:

[root@localhost php-7.3.1]# make
...
Build complete.
Don't forget to run 'make test'.

编译错误

在编译过程中可能会出现 zip 安装错误:

[root@localhost php-7.3.1]# make
...
/usr/local/include/zip.h:59:21: fatal error: zipconf.h: No such file or directory
...

复制 zipconf.h

[root@localhost php-7.3.1]# cp /usr/local/lib/libzip/include/zipconf.h /usr/local/include/zipconf.h

安装

编译成功后通过命令 make install 进行安装:

[root@localhost php-7.3.1]# make install
Installing shared extensions:     /usr/local/php7.3.1/lib/php/extensions/debug-n
on-zts-20180731/
Installing PHP CLI binary:        /usr/local/bin/
Installing PHP CLI man page:      /usr/local/php7.3.1/php/man/man1/
Installing PHP FPM binary:        /user/local/sbin/
Installing PHP FPM defconfig:     /usr/local/php7.3.1/etc/
Installing PHP FPM man page:      /usr/local/php7.3.1/php/man/man8/
Installing PHP FPM status page:   /usr/local/php7.3.1/php/php/fpm/
Installing phpdbg binary:         /usr/local/bin/
Installing phpdbg man page:       /usr/local/php7.3.1/php/man/man1/
Installing PHP CGI binary:        /usr/local/bin/
Installing PHP CGI man page:      /usr/local/php7.3.1/php/man/man1/
Installing build environment:     /usr/local/php7.3.1/lib/php/build/
Installing header files:          /usr/local/php7.3.1/include/php/
Installing helper programs:       /usr/local/bin/
  program: phpize
  program: php-config
Installing man pages:             /usr/local/php7.3.1/php/man/man1/
  page: phpize.1
  page: php-config.1
Installing PEAR environment:      /usr/local/php7.3.1/lib/php/
[PEAR] Archive_Tar    - installed: 1.4.4
[PEAR] Console_Getopt - installed: 1.4.1
[PEAR] Structures_Graph- installed: 1.1.1
[PEAR] XML_Util       - installed: 1.4.3
[PEAR] PEAR           - installed: 1.10.7
Wrote PEAR system config file at: /usr/local/php7.3.1/etc/pear.conf
You may want to add: /usr/local/php7.3.1/lib/php to your php.ini include_path
Installing PDO headers:           /usr/local/php7.3.1/include/php/ext/pdo/

复制配置文件

[root@localhost php-7.3.1]# cp php.ini-production /usr/local/php7.3.1/lib/php
.ini
[root@localhost php-7.3.1]# cp php.ini-production /usr/local/php7.3.1/etc/php
.ini
[root@localhost php-7.3.1]# cp /usr/local/php7.3.1/etc/php-fpm.conf.default /
usr/local/php7.3.1/etc/php-fpm.conf
[root@localhost php-7.3.1]# ln -s /usr/local/php7.3.1/sbin/php-fpm /usr/local
/bin
[root@localhost php-7.3.1]# cd /usr/local/php7.3.1/etc/php-fpm.d

配置 Apache

关联 PHP

通过 yum 安装的 httpd ,能够在 /etc/httpd/conf 中找到 httpd 的配置文件 httpd.conf ,因为编译安装时加入了 --with-apxs2 ,安装完成后 httpd.conf 已经自动加载了 PHP ,在 LoadModule 中有一句:

# Example:
# LoadModule foo_module modules/mod_foo.so
LoadModule php7_module        /usr/lib64/httpd/modules/libphp7.so
# LoadModule rewrite_module     modules/mod_rewrite.so
#

如果发现没有自动加载,那就手动添加:

# LoadModule php7_module        modules/libphp7.so

配置解析 PHP

IfModule dir_module 添加上 index.php


    DirectoryIndex index.html index.php

IfModule mime_module 中的 AddType 后面加上三句:


	...
	#
	AddType application/x-compress .Z
	AddType application/x-gzip .gz .tgz
	
	// 新添加的
	AddType application/x-httpd-php .php
	AddType application/x-httpd-php .php .phtml .php3
	AddType application/x-httpd-php-source .phps
	...

如果不添加上面的配置,将不解析 PHP

修改 Web 路径

修改 DocumentRootApache 默认的根目录是 /var/www/html ,可以修改成指定的目录:

DocumentRoot "/home/user/文档/web"

	Options Indexes FollowSymLinks
	AllowOverride All
	Require all granted

这时重新运行 Apache

[root@localhost php-7.3.1]# systemctl restart httpd.service

然后生成 phpinfo() 文件:

[root@localhost php-7.3.1]# echo "
>phpinfo();" >>/home/user/文档/web/index.php

然后打开 localhost 查看网页运行。

问题

问题 1 :403 禁止错误

403 Forbidden :
	You don't have permission to access /wordpress on this server

这时可能是没有权限造成的,解决方式是,查看当前运行服务的用户:

[root@localhost php-7.3.1]# ps -ef |grep php
user   112288 111877  0 16:06 pts/0    00:00:00 grep --color=auto php

就将 httpd.conf 中的用户和用户组改成当前用户的:

User user
Group www

然后将 Web 文件夹的用户和权限修改:

[root@localhost php-7.3.1]# chown -R user::www /home/user/文档/web
[root@localhost php-7.3.1]# chmod -R 777 /home/user/文档/web

重启 Apache 查看网页运行。如果还不行,就检查 SELinux 是否启用状态:

[root@localhost php-7.3.1]# /usr/sbin/sestatus -v
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      31

Process contexts:
Current context:                unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Init context:                   system_u:system_r:init_t:s0

File contexts:
Controlling terminal:           unconfined_u:object_r:user_devpts_t:s0
/etc/passwd                     system_u:object_r:passwd_file_t:s0
/etc/shadow                     system_u:object_r:shadow_t:s0
/bin/bash                       system_u:object_r:shell_exec_t:s0
/bin/login                      system_u:object_r:login_exec_t:s0
/bin/sh                         system_u:object_r:bin_t:s0 -> system_u:object_r:shell_exec_t:s0
/sbin/agetty                    system_u:object_r:getty_exec_t:s0
/sbin/init                      system_u:object_r:bin_t:s0 -> system_u:object_r:init_exec_t:s0
/usr/sbin/sshd                  system_u:object_r:sshd_exec_t:s0

如果 SELinux status 是启用状态 enabled ,将 SELinux 临时关闭,设置为 permissive 模式(setenforce 0enforcing 模式):

[root@localhost php-7.3.1]# setenforce 0

此时应该能够看到 phpinfo 的信息了。
永久关闭可以修改 /etc/selinux/config 文件,将 SELINUX=enforcing 改为 SELINUX=disabled

问题 2 :PHP 7.3.1 bug

如果出现了以下问题:

PHP Warning: preg_match(): JIT compilation failed: no more memory in ...

解决方式:修改 /usr/local/php7.3.1/etc/php.ini ,重启 PHP

将
;pcre.jit=1
改为:
pcre.jit=0

问题 3 :ThinkPHP5 权限异常

如果出现:

mkdir() Permission denied

则是 runtime 文件没有权限,应该设置:

[root@localhost tp5]# chmod -R 777 runtime

问题 4 :ThinkPHP5 路由不解析

如果发现 thinkphp5 不解析路由时,应该检查是否开启了 mod_rewrite ,在 phpinfo 中查看 Loaded Modules ,其中列出了所有 apache2handler 已经开启的模块,看是否包含了 mod_rewrite

如果没有开启 mod_rewrite,则修改 httpd.conf 文件,在 LoadModule 下添加:

# LoadModule rewrite_module        modules/mod_rewrite.so

然后将 httpd.conf 中的所有 AllowOverride None 修改为 AllowOverride All 。重启 Apache 后就可以正常访问了。

你可能感兴趣的:(PHP,CentOS,Apache,ThinkPHP5)