找回密码
 立即注册
查看: 26|回复: 0

JAVA web + PHP7.4 + PHPMyAdmin5.2 JAR运行整合

[复制链接]

299

主题

0

回帖

299

积分

版主

积分
299
发表于 2026-10-11 22:55:17 | 显示全部楼层 |阅读模式
通过网盘分享的文件:JAVAwebPHPMyAdmin
链接: https://pan.baidu.com/s/1n_tYYRtVandlLm_iMsnBow?pwd=qje3 提取码: qje3

JAVA web + PHP7.4 + PHPMyAdmin5.2 JAR运行整合

更豆包 了了大半天 做的我没用编程基础 这个强拉在一起也算是 不按常理出牌
目的是最近 很多老游戏都是 mysql 5.5 数据库的搞的头大 于是就手动编译 兼容 CentOS7.x 和 Ubuntu20.x~24.x
使用脚本启动,问题来了我不习惯使用命令行操作数据库 于是 就跟豆包聊了一个 奇葩 jar 程序出来
使用文旦 也是豆包生成的别问 怎么修改 真一点不懂
jar 主要角色是扮演WEB服务器 连携PHP 驱动  phpMyadmin  这样 我们通过浏览器来管理数据库
jar运行的时候 jar里面的  依赖 PHP  phpMyadmin  会解压 出来 然拉起服务
rgbrgb

  • <font size=&quot;3&quot;><b># pma-server:单 JAR 便携版 phpMyAdmin 网关 </b></font>— 源码 / 构建 / 部署 全说明

  • > 一句话:把「PHP 7.4 + phpMyAdmin 5.2.3 + SQLite/MySQL 双驱动 + 依赖库」全部塞进一个 JAR,JDK8 直接 `java -jar` 跑起来,Windows/Linux 双平台通用,配置全部存 SQLite,不用装宝塔、不用配 Apache/Nginx。

  • ---

  • ## 一、这个 JAR 解决什么痛点

  • | 痛点 | 传统方案 | 本方案 |
  • |---|---|---|
  • | 装个 phpMyAdmin 要整套 LAMP/宝塔,环境重、依赖多 | 装 PHP + Apache/Nginx + 各种扩展 | 单 JAR 全内嵌,解压即用 |
  • | PHP 版本/扩展对不上,报错满天飞 | 手工调 php.ini、装扩展 | php-cgi 内嵌在 jar,版本固定 7.4.33 |
  • | 服务器旧(CentOS 7)缺新库 | 满世界找 .so | 依赖库(libzip.so.5、libsodium.so.23 等)打进 jar lib/,自动解压 |
  • | 数据库管理页裸奔,谁都能试密码 | 直接暴露端口 | 门卫登录(自定义前缀 + 账号密码 + 会话过期)+ 每 IP 限速 |
  • | 配置散落各处、迁移服务器要重配 | server.conf / config.inc.php | 13 项配置全存 SQLite(pma-server.db),拷贝即迁移 |
  • | 密码明文写在配置文件里 | 文本配置 | SQLite 文件 + 打码查看工具,权限独立 |
  • | Windows / Linux 两套部署 | 两套环境两套配置 | 同一个 jar 双平台跑,内嵌对应 PHP |

  • **核心安全机制(三层)**:
  • 1. **门卫拦截**:只有带指定前缀(如 `/18806088212`)的路径能进,其余一律 403;门卫账号密码登录后发 HttpOnly Cookie 会话(默认 2 小时过期),退出数据库自动回门卫页。
  • 2. **每 IP 限速**:`rate_php_per_sec`(默认 20)= 每 IP 每秒最多 20 个 .php 请求,防毫秒级恶意高并发刷爆。
  • 3. **PHP 线程级安全**:启动时向 php.ini 注入安全项,并写前置安全钩子(禁 `exec`/`system`/`passthru` 等危险函数),防 shell 反弹/源码泄露。

  • ---

  • ## 二、源码文件说明(3 个 .java)

  • | 文件 | 作用 | 关键实现 |
  • |---|---|---|
  • | **Server.java** | 主程序(唯一入口,类名 `Server`) | JDK8 `HttpsServer`/`HttpServer` 起服务;php-cgi 桥接;门卫登录/限速/登出拦截;JAR 内嵌资源解压与关闭回收;自签证书(100 年);HTTP→HTTPS 301;启动时自动建 `phpmyadmin` 配置存储库 |
  • | **GwDb.java** | SQLite 配置库(替代 server.conf) | 内置种子(jar 内 `pma-server.db`)→ 外部(jar 同级 `pma-server.db`)优先读写;首次启动外部不存在则用内置初始化;13 个配置键补缺(server.conf 现值 → 内置值 → 代码默认值 三级兜底) |
  • | **AuthTool.java** | 命令行改配置工具 | `list` / `set key value` / `gw-pass` / `db-pass` / `gw-user` / `db-user` / `gw-prefix` / `db-host` / `db-port`,密码查看时打码 `12****` |

  • **Server.java 主流程**:
  • ```
  • main()
  • ├─ GwDb.init()          // SQLite 配置库就绪(内置种子 → 外部初始化)
  • ├─ 从 SQLite 覆盖全部配置  // 端口/限速/DEBUG/数据库/门卫
  • ├─ extractPma()          // 解压内嵌 phpMyAdmin + PHP,生成 config.inc.php
  • ├─ ensureCert()          // 生成 100 年自签名证书(只一次,存持久目录)
  • ├─ HTTPS 主服务          // https://host:HTTPS_PORT
  • ├─ HTTP 301 服务          // http://hostORT → https://host:HTTPS_PORT
  • └─ shutdown hook          // 关停时自动回收解压目录
  • ```

  • **SQLite 13 项配置键(全部在 pma-server.db 的 auth_config 表)**:

  • | key | 默认值 | 含义 |
  • |---|---|---|
  • | db_host / db_port | 127.0.0.1 / 3306 | 目标 MySQL 地址/端口 |
  • | db_user / db_pass | root / 123456 | 目标 MySQL 账号/密码 |
  • | gw_user / gw_pass | admin / 123456 | 门卫登录账号/密码 |
  • | gw_prefix | /464aCS | 访问前缀(非法路径 403) |
  • | gw_session_hours | 2 | 门卫会话有效期(小时) |
  • | port / https_port | 8080 / 8443 | HTTP 跳转端口 / HTTPS 主端口 |
  • | rate_php_per_sec | 20 | 每 IP 每秒 .php 请求上限 |
  • | debug | false | 调试开关(true 打印请求详情) |
  • | mysql_bin | 空 | Windows 下 mysql.exe 完整路径(Linux 走 PATH) |

  • ---

  • ## 三、用 IDE 构建(IntelliJ IDEA 示例)

  • > 原则:**IDE 只负责编译出 .class,内嵌大资源(PHP/phpMyAdmin/驱动/依赖库)用脚本合并**,比 IDEA 的 Artifact 更可控、不易踩坑。

  • ### 第 1 步:新建项目
  • 1. `File → New → Project`,JDK 选 **1.8**(项目 SDK = jdk1.8.0_xxx)。
  • 2. 把 `Server.java`、`GwDb.java`、`AuthTool.java` 拷到 `src/` 根目录(**文件名必须叫 Server.java,类名就是 Server,不要改**)。

  • ### 第 2 步:添加依赖(两个驱动 jar)
  • 1. `File → Project Structure → Modules → 选中模块 → Dependencies → + → JARs or directories`
  • 2. 加入:`sqlite-jdbc-3.36.0.3.jar`、`mysql-connector-java-5.1.49.jar`
  • 3. 确认编译通过:`Build → Build Project`(或右键 Server.java → Run,能看到 `[GwDb] SQLite 配置库就绪` 即正常)。

  • ### 第 3 步:打可执行 JAR(合并内嵌资源)
  • 编译产物(`out/production/<模块>/` 下的 .class)打包顺序:

  • ```
  • 1. 准备 class:Server.class + Server$Handler.class + Server$Handler$1.class
  •                + Server$Handler$2.class + Server$RedirectHandler.class
  •                + GwDb.class + AuthTool.class
  •    &#9888;&#65039; 内部类必须一起打包,只放 Server.class 新功能不生效(经典坑)

  • 2. 内置种子:pma-server.db.embedded → 改名为 pma-server.db → 放 jar 根

  • 3. 合并驱动:sqlite-jdbc-3.36.0.3.jar + mysql-connector-java-5.1.49.jar
  •    (跳过各自的 META-INF/MANIFEST.MF 和 META-INF/services/)

  • 4. 合并内嵌资源(从上一版成品 jar 里取,或打包脚本维护):
  •    php_7.4.33/   Linux PHP (php-cgi)
  •    php_win/      Windows PHP (php-cgi.exe)
  •    pma/          phpMyAdmin 5.2.3
  •    lib/          Linux 依赖库 (libzip.so.5、libsodium.so.23 等)
  •    winlib/       Windows VC 运行库

  • 5. MANIFEST.MF 必须含: Main-Class: Server    ← 否则 java -jar 报找不到主类
  • ```

  • **推荐用 Python 脚本合并(本机已写好流程,可复用)**:
  • ```python
  • import zipfile, os
  • # 新 jar = 旧 jar 全部内容 - 旧 class - pma-server.db + 新 class + 内置种子 + 两驱动
  • # 关键: 用 zipfile 重写, 跳过 META-INF/MANIFEST.MF 与 META-INF/services/
  • # 详见项目内 ssh88_allin_deploy.py / README.txt 的步骤
  • ```

  • ### 第 4 步:命令行验证(不依赖 IDE)
  • ```bash
  • java -jar pma-server.jar
  • # 期望输出: [GwDb] SQLite 配置库就绪 ... | 限速 20/s | DEBUG false
  • # 然后浏览器开 https://127.0.0.1:8443/464aCS/ 看门卫页
  • ```

  • ---

  • ## 四、成品包目录结构

  • ### JAR 内部结构
  • ```
  • pma-server.jar
  • ├── META-INF/MANIFEST.MF          Main-Class: Server
  • ├── Server.class (+ $Handler、$Handler$1/2、$RedirectHandler)   主程序
  • ├── GwDb.class / AuthTool.class   配置库 / 改密工具
  • ├── pma-server.db                 内置种子配置库(只读兜底,首次启动初始化外部)
  • ├── org/sqlite/**                 SQLite JDBC 驱动(双平台 native)
  • ├── com/mysql/**                  MySQL Connector/J 5.1.49(兼容 MySQL 5.5~5.7)
  • ├── php_7.4.33/                   Linux PHP 7.4.33(启动解压到运行目录)
  • ├── php_win/                      Windows PHP 7.4(同上)
  • ├── pma/                          phpMyAdmin 5.2.3 全量
  • ├── lib/                          Linux 依赖库(libzip.so.5、libsodium.so.23 等)
  • └── winlib/                       Windows VC 运行库
  • ```

  • ### 部署目录(jar 同级,Linux)
  • ```
  • /data/Server/PHPMyAdmin/
  • ├── pma-server.jar        ← 主程序(唯一必需)
  • ├── pma-server.db         ← 外部配置库(运行时读写,所有账号/端口/限速都在这里)
  • ├── javaweb.sh            ← 启停脚本(start/stop/restart/status)
  • ├── pma-auth.sh           ← 改账号密码脚本(封装 AuthTool)
  • ├── 源码.tar.gz           ← 源码备份包(可选)
  • └── server.conf           ← 已废弃(可删,运行不再读取)
  • ```

  • ### 运行时自动创建的目录
  • | 路径 | 作用 | 说明 |
  • |---|---|---|
  • | Linux: `/opt/CN.I8520.YYDS/MYlib/php7/pma_tmp/` | twig 缓存 / 导出 / session | 启动时自动建,www:www |
  • | Linux: `/home/i8520/.i8520/pma_embedded/` | phpMyAdmin 解压运行目录 | 启动解压,关闭时自动回收 |
  • | Windows: `C:/Users/admin/_i8520/` | 同上(Windows 版) | 隐藏属性,关闭时回收 |

  • ---

  • ## 五、Shell 脚本使用

  • ### javaweb.sh — 启停服务
  • ```bash
  • ./javaweb.sh start      # 启动(自动拉起本地 MySQL → 建 www 用户 → 授权 → su www 跑 jar)
  • ./javaweb.sh stop       # 停止
  • ./javaweb.sh restart    # 重启(改配置后常用)
  • ./javaweb.sh status     # 查看状态(PID + 运行用户)
  • ```
  • - 日志:`/tmp/javaweb.log`(排查就 `tail -f /tmp/javaweb.log`)
  • - 强制以 `www` 用户运行;www 不存在自动创建
  • - 启动命令本质:`su -s /bin/bash www -c &quot;nohup java -Xms256m -Xmx256m -jar pma-server.jar > /tmp/javaweb.log 2>&1 &&quot;`

  • ### pma-auth.sh — 改账号密码(改完必须 restart 才生效)
  • ```bash
  • ./pma-auth.sh list                  # 查看当前全部配置(密码打码 12****)
  • ./pma-auth.sh gw-pass 新密码        # 改门卫密码
  • ./pma-auth.sh db-pass 新密码        # 改数据库密码
  • ./pma-auth.sh gw-user 新账号        # 改门卫账号
  • ./pma-auth.sh db-user 新账号        # 改数据库账号
  • ./pma-auth.sh gw-prefix /新前缀     # 改访问前缀
  • ./pma-auth.sh db-host 192.168.x.x   # 改数据库地址
  • ./pma-auth.sh db-port 3306          # 改数据库端口
  • ./pma-auth.sh set rate_php_per_sec 30   # 改限速
  • ./pma-auth.sh set debug true        # 开调试
  • ./javaweb.sh restart                # 最后重启生效
  • ```
  • - 也可以不重启只改配置:直接用 DB Browser for SQLite 打开 `pma-server.db` 改 `auth_config` 表(改完仍要重启)

  • ### 部署实例(当前 8.8 服务器现状)
  • ```
  • 服务:    https://192.168.8.8:21314   (主入口)
  •          http://192.168.8.8:31314    (自动 301 跳转 HTTPS)
  • 前缀:    /18806088212                 (门卫路径)
  • 门卫:    18806088212 / lcs520..!
  • 数据库:  root / 123456 @ 127.0.0.1:3306
  • 限速:    20/s     DEBUG: false
  • ```

  • ---

  • ## 六、踩坑记录(改代码/重新打包前必读)

  • | 坑 | 症状 | 解法 |
  • |---|---|---|
  • | 只替换 Server.class | 新功能不生效 | 内部类 `Server$Handler*`、`Server$RedirectHandler` 必须一起替换 |
  • | MANIFEST 没 Main-Class | `Error: Could not find or load main class Server` | jar 内 `META-INF/MANIFEST.MF` 写 `Main-Class: Server` |
  • | 服务器 javac 不覆盖旧源码 | 改了没生效 | 编译前先 `cp /tmp/新源码.java ./Server.java` 再 javac |
  • | Linux 缺 libzip.so.5 / libsodium.so.23 | php-cgi 起不来 | 从对应发行版包解出 .so 打进 jar `lib/`(已内嵌) |
  • | 解压目录 root 遗留 | www 删不掉、Permission denied | javaweb.sh start 先 `rm -rf` 再 `chown www:www`(已处理) |
  • | server.conf 残留 | 以为还在用 | 已完全废弃,配置全在 SQLite,文件可删 |
  • | Windows 下 mysql.exe 找不到 | 建 phpmyadmin 库失败 | `pma-auth.sh set mysql_bin C:/xxx/mysql.exe`(Linux 不用配) |




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|白黑论坛 |网站地图

GMT+8, 2026-10-25 02:32 , Processed in 0.021561 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表