PHP7.4安装与勾股OA部署(内网环境)

记录一次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系统,无报错。

  • 23
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值