记录一次PHP7.4安装
引言:因工作需要,需要部署一套勾股OA系统,且需要模拟内网环境,完全不连接外网(之前联网情况下使用宝塔可以在windows10系统、openEuler系统正常部署勾股OA,集成了很方便),该系统采用PHP开发,对PHP要求版本较高(7.4版本及以上),现有linux环境
(centos7、openEuler20.03等一系列el7操作系统)我找了一圈,没发现他要求的版本,大多数是7.1版本以下的,于是乎尝试源码包的方式安装。
我选择的是PHP7.4.16版本,当然你也可以选择更高版本因为我的操作系统是openEuler20.03的,比较适合el7的软件安装(PHP需要一大堆依赖项),包下载地址:
官网下载地址:https://www.php.net/downloads
安装包地址: https://www.php.net/distributions/php-7.4.16.tar.gz
1、相关软件包
我先把所有需要安装的包列举出来(这些可以使用yum安装):
epel-release
wegt
fileinfo
libmcrypt
libmcrypt-devel
mhash
mhash-devel libxml2
libxml2-devel
bzip2
bzip2-devel
gcc
gcc-c++
openssl-devel
sqlite
sqlite-devel
libcurl-devel
autoconf
automake
libtool
oniguruma
php-mysqlnd
php-gd
freetype
freetype-devel
libzip
libzip-devel
大概就是上面这么多,还有一些是在别处下载的源码包
另外下载的源码包有以下这些:
autoconf-latest.tar.gz
composer-setup.php
freetype-2.7.1.tar.gz
jpegsrc.v9.tar.gz
libgd-2.2.5.tar.gz
libmcrypt-2.5.8.tar.gz
libpng-1.6.41.tar.gz
libxml2-2.7.2.tar.gz
m4-1.4.9.tar.gz
oniguruma-6.9.4.tar.gz
pecl-memcache-php7.zip
php-7.4.16.tar.gz
2、安装
我是按照Centos7使用wget安装PHP7、Mysql5.6、Nginx1.9-CSDN博客
这篇帖子先把部分源码包安装了一下,写的还是比较详细的。
在执行php执行./configure命令时建议优先查看这部分,按照这个执行。
可能会出现的问题,可以参考下:
PHP编译时提示libjpeg.(a|so) not found(找不到JPEG库)https://blog.csdn.net/weixin_34151004/article/details/93123157
php7.4部分configure
命令做了一些更改。你可以使用./configure --help
查看适合的命令(这个命令很长),这里算是一个大坑了。
./configure --prefix=/usr/local/webserver/php --with-config-file-path=/usr/local/webserver/php/etc --with-mcrypt=/usr/local/libmcrypt --with-pdo-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-mysql-sock=/tmp/mysql.sock --with-pdo-mysql=/usr/local/mysql --enable-mysqlnd --with-gd --enable-gd --with-libxml-dir=/usr/local/libxml2 --with-png-dir=/usr/local/libpng --with-jpeg-dir=/usr/local/jpeg9 --with-freetype-dir=/usr/local/freetype --with-iconv --with-zlib --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --enable-mbregex --enable-fpm --enable-mbstring --enable-ftp --enable-gd-native-ttf --with-openssl --enable-pcntl --enable-sockets --with-xmlrpc --with-zip --enable-soap --without-pear --with-gettext --enable-session --with-curl --enable-ctype --with-jpeg --with-freetype
一部分源码包在执行make && make install
会出现缺少一些依赖,这时候就需要yum来安装上面的rpm包了,当然你也可以直接先安装上面说的rpm包。
3、PHP以及Nginx配置
安装完成之后就是配置了,这一步是最麻烦的
3.1、php配置
php的话,按照第二步给的勉强可以用,部分功能使用报错,需要修改以下配置
vim /usr/local/webserver/php/etc/php.ini
新增
extension=/usr/lib64/php/modules/gd.so
修改一(注意禁用方法这个是一行)
disable_functions = chroot,scandir,chgrp,chown,shell_exec,ini_alter,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,escapeshellcmd,dll,popen,disk_free_space,checkdnsrr,checkdnsrr,getservbyname,getservbyport,disk_total_space,posix_ctermid,posix_get_last_error,posix_getcwd, posix_getegid,posix_geteuid,posix_getgid, posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid, posix_getppid,posix_getpwnam,posix_getpwuid, posix_getrlimit, posix_getsid,posix_getuid,posix_isatty, posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid, posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname
修改二
error_log = /var/log/php_errors.log
到这里php7.4其实已经可以单独使用了。
验证方法执行 php -m
或者在项目根目录新建一个phpinfo.php文件,如我的文件建在/data/office-master/public/
下,此时访问你的虚拟机IP/phpinfo.php就可以看到了。
写入以下内容(phpinfo()函数可以查看php各种详细配置信息)大致效果如下图:
<?php
phpinfo();
?>
验证数据库扩展(mysqli、mysqlnd、pdo),也可以按照上面的方法建对应的php文件并写入对应方法。
如验证mysqli扩展,代码如下:
<?php
$servername = "192.168.209.122";
$username = "user";
$password = "123456";
// Create connection
$conn = new mysqli($servername, $username, $password);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
if (!$result) {
die("Query failed: " . mysqli_error($conn));
}
echo "Connected successfully";
?>
验证pdo扩展,访问http://192.168.209.122/phpinfo_pdo.php出现Connected successfully,则证明pdo扩展连接MySQL正常:
<?php
$servername = "192.168.209.122";
$username = "user";
$password = "123456";
$dbname = "mysql";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// 设置 PDO 错误模式为异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}
?>
3.2、nginx配置
使用yum安装的nginx,默认配置文件路径在/etc/nginx/
下,这一步挺坑的,我这里直接把/etc/nginx/nginx.conf
整体粘出来。
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
##注意user用户必须要跟php项目目录拥有者用户一致
user www;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name 192.168.209.122;#这里写你的虚拟机IP或者在hosts里配置的域名都行
root /data/office-master/public;#你项目运行的根目录,我的理解是存在index.php的目录
index index.php;#字面意思
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?s=$1 last; break;
}
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
# 设置监听端口
fastcgi_pass 127.0.0.1:9000;
# 设置脚本文件请求的路径
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 引入fastcgi的配置文件
include fastcgi_params;
}
}
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers PROFILE=SYSTEM;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}
注意:当你使用nginx作为web服务器时,要避免端口冲突问题,httpd的默认端口也是80。
也要把需要开放的端口放开,你部署时直接把防火墙关了也不碍事,还有selinux也关了
到这里nginx也就配置好了,可以验证一下访问你的域名或者虚拟机ip可以出现apache欢迎页面。
4、勾股OA剩余的坑
当上面3.1php配置阶段,使用mysqli、与pdo扩展连接mysql正常,使用本地navicat连接也没报错,但当你在勾股oa安装页面,连接数据库时,会出现mysql错误:未知的数据库连接。
1.一开始的解决方式,按照他文档里的说的,修改.env.debug为./env,开启debug,可是这个错误在debug控制台并没有显示,network里也不存在。后面就找nginx的日志目录、mysql的日志目录、php的日志目录,都没有发现异常。
2.我以为是mysqli、mysqlnd、pdo三者冲突的问题,后面重新安装几次了php(开始认为是在安装php时,执行configure命令的问题),后面一步一步排除了。
3.又考虑会不会是勾股oa系统连接数据库的方式不是上面这三个,这时候我看到他的文档里留的有几个QQ群,便加了过去,咨询了群主,他告诉我他们使用的是thinkphp官方的连接方式,也就是说无论三面这仨扩展用哪个都没问题,不存在冲突问题。这时候我想着查查源码,将项目导入idea,分析源码的目录结构,可以看到安装这一步在step3.html页面,根据页面里的方法调用很容易找到数据库连接与校验逻辑,勾股oa源码:
public function install()
{
$data = get_params();
try {
validate(InstallCheck::class)->check($data);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$dbName = $data['DB_NAME'];
//验证表是否存在
try {
// 连接数据库,勾股OA原始代码
#$link = @new mysqli("{$data['DB_HOST']}:{$data['DB_PORT']}", $data['DB_USER'], $data['DB_PWD']);
//我修改后的代码
$link = @new mysqli($data['DB_HOST'], $data['DB_USER'], $data['DB_PWD']);
} catch (\Exception $e) {
// 这是进行异常捕获,创建数据库
$error = $e->getMessage();
return to_assign(1, '数据库链接失败:' . $error);die;
}
// 获取错误信息
$error = $link->connect_error;
if (!is_null($error)) {
// 转义防止和alert中的引号冲突
$error = addslashes($error);
return to_assign(1, '数据库链接失败:' . $error);die;
}
#$link = @new mysqli("{$data['DB_HOST']}:{$data['DB_PORT']}", $data['DB_USER'], $data['DB_PWD']);
而mysqli扩展默认连接mysql的代码是
$conn = new mysqli($servername, $username, $password);
眼尖的可能已经发现了,勾股OA代码比mysqli在host那里多了一个端口号。
修改后,正常安装勾股OA系统,无报错。