为了将 Apache
和 PHP
关联生成 libphp7.so
文件,需要在安装 PHP
之前安装 Apache
:
[root@localhost ~]# yum -y install httpd
另外需要安装 httpd-devel
,如果没有 httpd-devel
,在安装 PHP
时不会生成 libphp7.so
文件:
[root@localhost ~]# yum -y install httpd-devel
查看 CentOS 版本信息
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
获取源码并解压,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
使用 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
版本过低,因为使用 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
类型是在头文件 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
和 bzip2-devel
。
configure: error: Please reinstall the BZip2 distribution
解决方式:
[root@localhost php-7.3.1]# yum install -y bzip2 bzip2-devel
如果在安装 GD
时出现提示缺少 webp/decode.h
,需要安装 libwebp
和 libwebp-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
通过 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
在 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
。
修改 DocumentRoot
和
,Apache
默认的根目录是 /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
查看网页运行。
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 0
为 enforcing
模式):
[root@localhost php-7.3.1]# setenforce 0
此时应该能够看到 phpinfo
的信息了。
永久关闭可以修改 /etc/selinux/config
文件,将 SELINUX=enforcing
改为 SELINUX=disabled
。
如果出现了以下问题:
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
如果出现:
mkdir() Permission denied
则是 runtime
文件没有权限,应该设置:
[root@localhost tp5]# chmod -R 777 runtime
如果发现 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
后就可以正常访问了。