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/93123157php7.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;
- }
而mysqli扩展默认连接mysql的代码是
$conn = new mysqli($servername, $username, $password);眼尖的可能已经发现了,勾股OA代码比mysqli在host那里多了一个端口号。
修改后,正常安装勾股OA系统,无报错。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。
在线投稿:投稿 站长QQ:1888636
后台-插件-广告管理-内容页尾部广告(手机) |