Files
k3s-configs/php-test/README.md
2026-01-21 13:37:13 +00:00

366 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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