366 lines
9.0 KiB
Markdown
366 lines
9.0 KiB
Markdown
# PHP MySQL 测试项目
|
||
|
||
这是一个基于 PHP 8 的简单数据库测试项目,包含表单提交功能和热更新支持。
|
||
|
||
## 📋 项目特性
|
||
|
||
- ✅ PHP 8 支持
|
||
- ✅ MySQL 数据库连接(使用 PDO)
|
||
- ✅ 表单数据提交和验证
|
||
- ✅ 实时显示最近提交的数据
|
||
- ✅ 热更新功能(自动刷新页面)
|
||
- ✅ 响应式设计
|
||
- ✅ 安全的 SQL 预处理语句
|
||
- ✅ k3s 集群部署支持
|
||
- ✅ Docker 容器化
|
||
- ✅ GitOps 自动部署(ArgoCD)
|
||
- ✅ HTTPS 支持(Let's Encrypt)
|
||
- ✅ 私有镜像仓库集成
|
||
|
||
## 📁 项目结构
|
||
|
||
```
|
||
php-test/
|
||
├── config.php # 数据库配置文件
|
||
├── Database.php # 数据库连接类
|
||
├── index.php # 主页面(表单和数据展示)
|
||
├── submit.php # 表单提交处理
|
||
├── schema.sql # 数据库表结构
|
||
├── watch.php # 文件监控脚本(可选)
|
||
├── Dockerfile # Docker 镜像构建文件
|
||
├── deploy.sh # k3s 手动部署脚本
|
||
├── undeploy.sh # k3s 清理脚本
|
||
├── build-and-push.sh # 构建并推送镜像到私有仓库
|
||
├── gitops-deploy.sh # GitOps 自动部署脚本(推荐)
|
||
├── argocd-app.yaml # ArgoCD Application 配置
|
||
├── k8s/ # Kubernetes 配置文件
|
||
│ ├── mysql-deployment.yaml
|
||
│ ├── mysql-configmap.yaml
|
||
│ ├── php-deployment.yaml
|
||
│ ├── php-configmap.yaml
|
||
│ └── ingress.yaml # Ingress 配置(HTTPS)
|
||
└── README.md # 项目说明文档
|
||
```
|
||
|
||
## 🚀 快速开始
|
||
|
||
本项目支持三种部署方式:**GitOps 自动部署(推荐)**、**k3s 手动部署**和**本地开发环境**。
|
||
|
||
---
|
||
|
||
## 🎯 方式一:GitOps 自动部署(推荐)
|
||
|
||
### 前置条件
|
||
|
||
- ✅ k3s 集群已部署
|
||
- ✅ ArgoCD 已安装(https://argocd.u9.net3w.com)
|
||
- ✅ 私有 Docker Registry 已部署(https://registry.u9.net3w.com)
|
||
- ✅ Gitea 已部署(https://git.u9.net3w.com)
|
||
- ✅ cert-manager + Let's Encrypt 已配置
|
||
|
||
### 步骤 1: 配置 Git 远程仓库
|
||
|
||
```bash
|
||
# 在 Gitea 创建仓库: k3s-configs
|
||
# 然后添加远程仓库
|
||
git remote add origin https://git.u9.net3w.com/fei/k3s-configs.git
|
||
|
||
# 首次推送
|
||
git push -u origin master
|
||
```
|
||
|
||
### 步骤 2: 一键 GitOps 部署
|
||
|
||
```bash
|
||
# 执行自动部署脚本(构建镜像 + 推送 + Git 提交 + ArgoCD 配置)
|
||
./gitops-deploy.sh
|
||
|
||
# 或指定镜像标签和提交信息
|
||
./gitops-deploy.sh v1.0.0 "Initial release"
|
||
```
|
||
|
||
**脚本会自动完成:**
|
||
1. 构建 Docker 镜像
|
||
2. 推送到私有仓库 `registry.u9.net3w.com`
|
||
3. 提交代码到 Git
|
||
4. 推送到远程仓库
|
||
5. 创建/更新 ArgoCD Application
|
||
|
||
### 步骤 3: 访问应用
|
||
|
||
部署完成后(约 3 分钟),通过以下地址访问:
|
||
|
||
```
|
||
https://php.u9.net3w.com
|
||
```
|
||
|
||
### 步骤 4: 日常开发流程
|
||
|
||
```bash
|
||
# 1. 修改代码
|
||
vim index.php
|
||
|
||
# 2. 重新部署(自动构建、推送、提交)
|
||
./gitops-deploy.sh v1.0.1 "Update UI"
|
||
|
||
# 3. ArgoCD 自动检测并部署(3分钟内)
|
||
```
|
||
|
||
### GitOps 管理命令
|
||
|
||
```bash
|
||
# 查看 ArgoCD 应用状态
|
||
kubectl get application php-test -n argocd
|
||
|
||
# 查看应用详情
|
||
kubectl describe application php-test -n argocd
|
||
|
||
# 手动触发同步
|
||
argocd app sync php-test
|
||
|
||
# 查看同步历史
|
||
argocd app history php-test
|
||
|
||
# 回滚到上一个版本
|
||
argocd app rollback php-test
|
||
|
||
# 查看 Pod 状态
|
||
kubectl get pods -n php-test
|
||
|
||
# 查看应用日志
|
||
kubectl logs -f deployment/php-app -n php-test
|
||
```
|
||
|
||
### ArgoCD 配置说明
|
||
|
||
- **自动同步**: 每 3 分钟检测一次 Git 仓库变化
|
||
- **自动修复**: 手动修改的资源会被自动恢复
|
||
- **自动清理**: Git 中删除的资源会自动从集群删除
|
||
- **命名空间**: 自动创建 `php-test` 命名空间
|
||
|
||
---
|
||
|
||
## 🐳 方式二:k3s 手动部署
|
||
|
||
### 1. 环境要求
|
||
|
||
- k3s 集群
|
||
- Docker
|
||
- kubectl
|
||
|
||
### 2. 一键部署
|
||
|
||
使用提供的部署脚本,一键部署到 k3s 集群:
|
||
|
||
```bash
|
||
./deploy.sh
|
||
```
|
||
|
||
部署脚本会自动完成以下操作:
|
||
1. 构建 Docker 镜像
|
||
2. 导入镜像到 k3s
|
||
3. 创建命名空间 `php-test`
|
||
4. 部署 MySQL 数据库(包含持久化存储)
|
||
5. 部署 PHP 应用(2个副本)
|
||
6. 创建 NodePort Service(端口 30080)
|
||
|
||
### 3. 访问应用
|
||
|
||
部署完成后,通过以下地址访问:
|
||
|
||
```
|
||
http://localhost:30080
|
||
http://<节点IP>:30080
|
||
```
|
||
|
||
### 4. 管理命令
|
||
|
||
```bash
|
||
# 查看部署状态
|
||
kubectl get all -n php-test
|
||
|
||
# 查看 Pod 日志
|
||
kubectl logs -f deployment/php-app -n php-test
|
||
|
||
# 查看 MySQL 日志
|
||
kubectl logs -f deployment/mysql -n php-test
|
||
|
||
# 进入 PHP 容器
|
||
kubectl exec -it deployment/php-app -n php-test -- bash
|
||
|
||
# 清理部署
|
||
./undeploy.sh
|
||
```
|
||
|
||
### 5. 配置说明
|
||
|
||
- **MySQL 配置**: 在 `k8s/mysql-deployment.yaml` 中的 Secret 配置
|
||
- Root 密码: `rootpassword`
|
||
- 数据库名: `test_db`
|
||
- 用户名: `phpuser`
|
||
- 密码: `phppassword`
|
||
|
||
- **PHP 配置**: 在 `k8s/php-configmap.yaml` 中配置数据库连接
|
||
|
||
- **持久化存储**: MySQL 数据存储在 PVC 中,重启不会丢失数据
|
||
|
||
---
|
||
|
||
## 💻 方式二:本地开发环境
|
||
|
||
### 1. 环境要求
|
||
|
||
- PHP 8.0 或更高版本
|
||
- MySQL 5.7 或更高版本
|
||
- Web 服务器(Apache/Nginx)或 PHP 内置服务器
|
||
|
||
### 2. 数据库配置
|
||
|
||
#### 方法一:使用 SQL 文件创建数据库
|
||
|
||
```bash
|
||
mysql -u root -p < schema.sql
|
||
```
|
||
|
||
#### 方法二:手动创建
|
||
|
||
```sql
|
||
CREATE DATABASE IF NOT EXISTS test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||
|
||
USE test_db;
|
||
|
||
CREATE TABLE IF NOT EXISTS test_data (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
name VARCHAR(100) NOT NULL,
|
||
email VARCHAR(100) NOT NULL,
|
||
message TEXT,
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
```
|
||
|
||
### 3. 修改数据库配置
|
||
|
||
编辑 `config.php` 文件,根据你的环境修改数据库连接信息:
|
||
|
||
```php
|
||
define('DB_HOST', 'localhost'); // 数据库主机
|
||
define('DB_NAME', 'test_db'); // 数据库名称
|
||
define('DB_USER', 'root'); // 数据库用户名
|
||
define('DB_PASS', ''); // 数据库密码
|
||
```
|
||
|
||
### 4. 启动项目
|
||
|
||
#### 使用 PHP 内置服务器(推荐用于开发)
|
||
|
||
```bash
|
||
cd /home/fei/k3s/php-test
|
||
php -S localhost:8000
|
||
```
|
||
|
||
然后在浏览器中访问:`http://localhost:8000`
|
||
|
||
#### 使用 Apache/Nginx
|
||
|
||
将项目目录配置为虚拟主机的根目录,然后通过配置的域名访问。
|
||
|
||
## 🔥 热更新功能
|
||
|
||
项目内置了两种热更新方式:
|
||
|
||
### 方式一:前端自动检测(已集成)
|
||
|
||
`index.php` 中已经集成了 JavaScript 热更新脚本,会每 2 秒检测一次文件变化并自动刷新页面。无需额外配置。
|
||
|
||
### 方式二:文件监控脚本(可选)
|
||
|
||
在另一个终端窗口运行文件监控脚本:
|
||
|
||
```bash
|
||
php watch.php
|
||
```
|
||
|
||
这个脚本会监控项目目录中的 PHP、HTML、CSS、JS 文件变化,并在控制台输出变化信息。
|
||
|
||
## 📝 使用说明
|
||
|
||
1. 访问 `index.php` 页面
|
||
2. 填写表单(姓名、邮箱为必填项)
|
||
3. 点击"提交数据"按钮
|
||
4. 页面会显示提交结果,并在下方展示最近 5 条提交的数据
|
||
5. 修改任何 PHP 文件后,页面会自动刷新(热更新)
|
||
|
||
## 🔒 安全特性
|
||
|
||
- 使用 PDO 预处理语句防止 SQL 注入
|
||
- 表单数据验证和过滤
|
||
- HTML 输出转义防止 XSS 攻击
|
||
- 邮箱格式验证
|
||
|
||
## 🛠️ 技术栈
|
||
|
||
- **后端**: PHP 8
|
||
- **数据库**: MySQL
|
||
- **前端**: HTML5, CSS3, JavaScript (原生)
|
||
- **数据库访问**: PDO (PHP Data Objects)
|
||
|
||
## 📊 数据库表结构
|
||
|
||
```sql
|
||
test_data
|
||
├── id (INT, PRIMARY KEY, AUTO_INCREMENT)
|
||
├── name (VARCHAR(100), NOT NULL)
|
||
├── email (VARCHAR(100), NOT NULL)
|
||
├── message (TEXT)
|
||
└── created_at (TIMESTAMP, DEFAULT CURRENT_TIMESTAMP)
|
||
```
|
||
|
||
## 🐛 故障排除
|
||
|
||
### k3s 部署相关
|
||
|
||
**Pod 无法启动**
|
||
- 检查镜像是否成功导入: `sudo k3s ctr images ls | grep php-test`
|
||
- 查看 Pod 事件: `kubectl describe pod <pod-name> -n php-test`
|
||
- 查看 Pod 日志: `kubectl logs <pod-name> -n php-test`
|
||
|
||
**无法访问应用**
|
||
- 确认 Service 已创建: `kubectl get svc -n php-test`
|
||
- 检查 NodePort 是否正确: `kubectl get svc php-app -n php-test`
|
||
- 检查防火墙是否开放 30080 端口
|
||
|
||
**MySQL 连接失败**
|
||
- 检查 MySQL Pod 是否就绪: `kubectl get pods -n php-test`
|
||
- 查看 MySQL 日志: `kubectl logs deployment/mysql -n php-test`
|
||
- 确认 ConfigMap 中的数据库配置正确
|
||
|
||
**镜像更新后未生效**
|
||
- 重新构建并导入镜像
|
||
- 删除旧的 Pod: `kubectl delete pod -l app=php-app -n php-test`
|
||
- Kubernetes 会自动创建新的 Pod
|
||
|
||
### 本地开发环境
|
||
|
||
**数据库连接失败**
|
||
- 检查 `config.php` 中的数据库配置是否正确
|
||
- 确认 MySQL 服务是否正在运行
|
||
- 检查数据库用户权限
|
||
|
||
**页面显示空白**
|
||
- 检查 PHP 错误日志
|
||
- 确认 PHP 版本是否为 8.0 或更高
|
||
- 检查文件权限
|
||
|
||
**热更新不工作**
|
||
- 确保浏览器支持 JavaScript
|
||
- 检查浏览器控制台是否有错误
|
||
- 尝试清除浏览器缓存
|
||
|
||
## 📄 许可证
|
||
|
||
MIT License
|
||
|
||
## 👨💻 开发者
|
||
|
||
Created with Claude Code
|