您现在的位置是:首页 > 技术教程 正文

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

admin 阅读: 2024-03-16
后台-插件-广告管理-内容页头部广告(手机)

记录一次PHP7.4安装

引言:因工作需要,需要部署一套勾股OA系统,且需要模拟内网环境,完全不连接外网(之前联网情况下使用宝塔可以在windows10系统、openEuler系统正常部署勾股OA,集成了很方便),该系统采用PHP开发,对PHP要求版本较高(7.4版本及以上),现有linux环境

(centos7、openEuler20.03等一系列el7操作系统)我找了一圈,没发现他要求的版本,大多数是7.1版本以下的,于是乎尝试源码包的方式安装。

我选择的是PHP7.4.16版本,当然你也可以选择更高版本因为我的操作系统是openEuler20.03的,比较适合el7的软件安装(PHP需要一大堆依赖项),包下载地址:

  1. 官网下载地址:https://www.php.net/downloads
  2. 安装包地址: https://www.php.net/distributions/php-7.4.16.tar.gz
1、相关软件包

我先把所有需要安装的包列举出来(这些可以使用yum安装):

  1. epel-release
  2. wegt
  3. fileinfo
  4. libmcrypt
  5. libmcrypt-devel
  6. mhash
  7. mhash-devel libxml2
  8. libxml2-devel
  9. bzip2
  10. bzip2-devel
  11. gcc
  12. gcc-c++
  13. openssl-devel
  14. sqlite
  15. sqlite-devel
  16. libcurl-devel
  17. autoconf
  18. automake
  19. libtool
  20. oniguruma
  21. php-mysqlnd
  22. php-gd
  23. freetype
  24. freetype-devel
  25. libzip
  26. libzip-devel

大概就是上面这么多,还有一些是在别处下载的源码包

另外下载的源码包有以下这些:

  1. autoconf-latest.tar.gz
  2. composer-setup.php
  3. freetype-2.7.1.tar.gz
  4. jpegsrc.v9.tar.gz
  5. libgd-2.2.5.tar.gz
  6. libmcrypt-2.5.8.tar.gz
  7. libpng-1.6.41.tar.gz
  8. libxml2-2.7.2.tar.gz
  9. m4-1.4.9.tar.gz
  10. oniguruma-6.9.4.tar.gz
  11. pecl-memcache-php7.zip
  12. 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

  1. 新增
  2. extension=/usr/lib64/php/modules/gd.so
  3. 修改一(注意禁用方法这个是一行)
  4. 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
  5. 修改二
  6. error_log = /var/log/php_errors.log

到这里php7.4其实已经可以单独使用了。

验证方法执行 php -m或者在项目根目录新建一个phpinfo.php文件,如我的文件建在/data/office-master/public/下,此时访问你的虚拟机IP/phpinfo.php就可以看到了。

写入以下内容(phpinfo()函数可以查看php各种详细配置信息)大致效果如下图:

  1. <?php
  2. phpinfo();
  3. ?>

验证数据库扩展(mysqli、mysqlnd、pdo),也可以按照上面的方法建对应的php文件并写入对应方法。

如验证mysqli扩展,代码如下:

  1. <?php
  2. $servername = "192.168.209.122";
  3. $username = "user";
  4. $password = "123456";
  5. // Create connection
  6. $conn = new mysqli($servername, $username, $password);
  7. // Check connection
  8. if ($conn->connect_error) {
  9.  die("Connection failed: " . $conn->connect_error);
  10. }
  11. if (!$result) {
  12.    die("Query failed: " . mysqli_error($conn));
  13. }
  14. echo "Connected successfully";
  15. ?>

验证pdo扩展,访问http://192.168.209.122/phpinfo_pdo.php出现Connected successfully,则证明pdo扩展连接MySQL正常:

  1. <?php
  2. $servername = "192.168.209.122";
  3. $username = "user";
  4. $password = "123456";
  5. $dbname = "mysql";
  6. try {
  7. $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
  8. // 设置 PDO 错误模式为异常
  9. $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  10. echo "Connected successfully";
  11. }
  12. catch(PDOException $e)
  13. {
  14. echo "Connection failed: " . $e->getMessage();
  15. }
  16. ?>
3.2、nginx配置

使用yum安装的nginx,默认配置文件路径在/etc/nginx/下,这一步挺坑的,我这里直接把/etc/nginx/nginx.conf整体粘出来。

  1. # For more information on configuration, see:
  2. # * Official English Documentation: http://nginx.org/en/docs/
  3. # * Official Russian Documentation: http://nginx.org/ru/docs/
  4. ##注意user用户必须要跟php项目目录拥有者用户一致
  5. user www;
  6. worker_processes auto;
  7. error_log /var/log/nginx/error.log;
  8. pid /run/nginx.pid;
  9. # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
  10. include /usr/share/nginx/modules/*.conf;
  11. events {
  12. worker_connections 1024;
  13. }
  14. http {
  15. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  16. '$status $body_bytes_sent "$http_referer" '
  17. '"$http_user_agent" "$http_x_forwarded_for"';
  18. access_log /var/log/nginx/access.log main;
  19. sendfile on;
  20. tcp_nopush on;
  21. tcp_nodelay on;
  22. keepalive_timeout 65;
  23. types_hash_max_size 2048;
  24. include /etc/nginx/mime.types;
  25. default_type application/octet-stream;
  26. # Load modular configuration files from the /etc/nginx/conf.d directory.
  27. # See http://nginx.org/en/docs/ngx_core_module.html#include
  28. # for more information.
  29. include /etc/nginx/conf.d/*.conf;
  30. server {
  31. listen 80 default_server;
  32. listen [::]:80 default_server;
  33. server_name 192.168.209.122;#这里写你的虚拟机IP或者在hosts里配置的域名都行
  34. root /data/office-master/public;#你项目运行的根目录,我的理解是存在index.php的目录
  35. index index.php;#字面意思
  36. # Load configuration files for the default server block.
  37. include /etc/nginx/default.d/*.conf;
  38. location / {
  39. if (!-e $request_filename){
  40. rewrite ^(.*)$ /index.php?s=$1 last; break;
  41. }
  42. }
  43. error_page 404 /404.html;
  44. error_page 500 502 503 504 /50x.html;
  45. location = /50x.html {
  46. root /usr/share/nginx/html;
  47. }
  48. location ~ \.php$ {
  49. # 设置监听端口
  50. fastcgi_pass 127.0.0.1:9000;
  51. # 设置脚本文件请求的路径
  52. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  53. # 引入fastcgi的配置文件
  54. include fastcgi_params;
  55. }
  56. }
  57. # Settings for a TLS enabled server.
  58. #
  59. # server {
  60. # listen 443 ssl http2 default_server;
  61. # listen [::]:443 ssl http2 default_server;
  62. # server_name _;
  63. # root /usr/share/nginx/html;
  64. #
  65. # ssl_certificate "/etc/pki/nginx/server.crt";
  66. # ssl_certificate_key "/etc/pki/nginx/private/server.key";
  67. # ssl_session_cache shared:SSL:1m;
  68. # ssl_session_timeout 10m;
  69. # ssl_ciphers PROFILE=SYSTEM;
  70. # ssl_prefer_server_ciphers on;
  71. #
  72. # # Load configuration files for the default server block.
  73. # include /etc/nginx/default.d/*.conf;
  74. #
  75. # location / {
  76. # }
  77. #
  78. # error_page 404 /404.html;
  79. # location = /40x.html {
  80. # }
  81. #
  82. # error_page 500 502 503 504 /50x.html;
  83. # location = /50x.html {
  84. # }
  85. # }
  86. }

注意:当你使用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源码:

  1. public function install()
  2. {
  3. $data = get_params();
  4. try {
  5. validate(InstallCheck::class)->check($data);
  6. } catch (ValidateException $e) {
  7. // 验证失败 输出错误信息
  8. return to_assign(1, $e->getError());
  9. }
  10. $dbName = $data['DB_NAME'];
  11. //验证表是否存在
  12. try {
  13. // 连接数据库,勾股OA原始代码
  14. #$link = @new mysqli("{$data['DB_HOST']}:{$data['DB_PORT']}", $data['DB_USER'], $data['DB_PWD']);
  15. //我修改后的代码
  16. $link = @new mysqli($data['DB_HOST'], $data['DB_USER'], $data['DB_PWD']);
  17. } catch (\Exception $e) {
  18. // 这是进行异常捕获,创建数据库
  19. $error = $e->getMessage();
  20. return to_assign(1, '数据库链接失败:' . $error);die;
  21. }
  22. // 获取错误信息
  23. $error = $link->connect_error;
  24. if (!is_null($error)) {
  25. // 转义防止和alert中的引号冲突
  26. $error = addslashes($error);
  27. return to_assign(1, '数据库链接失败:' . $error);die;
  28. }
#$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系统,无报错。

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索