Update PHP test app - 2026-01-21 13:37:13

This commit is contained in:
K3s Admin
2026-01-21 13:37:13 +00:00
parent 33f803c82f
commit b93f156e19
14 changed files with 1026 additions and 0 deletions

23
php-test/Dockerfile Normal file
View File

@@ -0,0 +1,23 @@
FROM php:8.2-apache
# 安装 PDO MySQL 扩展
RUN docker-php-ext-install pdo pdo_mysql
# 启用 Apache mod_rewrite
RUN a2enmod rewrite
# 复制项目文件到容器
COPY . /var/www/html/
# 设置工作目录
WORKDIR /var/www/html
# 设置文件权限
RUN chown -R www-data:www-data /var/www/html \
&& chmod -R 755 /var/www/html
# 暴露80端口
EXPOSE 80
# 启动Apache
CMD ["apache2-foreground"]

91
php-test/GITOPS.md Normal file
View File

@@ -0,0 +1,91 @@
# PHP 测试项目 GitOps 部署指南
## 🎯 GitOps 自动部署架构
```
开发者修改代码
构建 Docker 镜像
推送到私有仓库 (registry.u9.net3w.com)
提交代码到 Git
推送到 Gitea (git.u9.net3w.com)
ArgoCD 自动检测变化 (3分钟内)
自动同步到 k3s 集群
应用自动更新 (https://php.u9.net3w.com)
```
## 🚀 快速开始
### 1. 首次部署
```bash
# 进入项目目录
cd /home/fei/k3s/php-test
# 配置 Git 远程仓库(如果还没配置)
git remote add origin https://git.u9.net3w.com/fei/k3s-configs.git
# 执行 GitOps 自动部署
./gitops-deploy.sh
```
### 2. 日常开发流程
```bash
# 修改代码
vim index.php
# 一键部署(构建、推送、提交、部署)
./gitops-deploy.sh v1.0.1 "Update feature"
# 等待 3 分钟ArgoCD 自动部署完成
# 访问: https://php.u9.net3w.com
```
## 📋 部署清单
### 已创建的文件
-`argocd-app.yaml` - ArgoCD Application 配置
-`build-and-push.sh` - 构建并推送镜像脚本
-`gitops-deploy.sh` - GitOps 一键部署脚本
-`k8s/ingress.yaml` - Ingress 配置HTTPS
-`k8s/php-deployment.yaml` - 已更新镜像地址为私有仓库
### 配置说明
**镜像仓库**: `registry.u9.net3w.com/php-test:latest`
**Git 仓库**: `https://git.u9.net3w.com/fei/k3s-configs.git`
**应用路径**: `php-test/k8s`
**访问域名**: `https://php.u9.net3w.com`
## 🔧 管理命令
```bash
# 查看 ArgoCD 应用状态
kubectl get application php-test -n argocd
# 手动触发同步
argocd app sync php-test
# 查看 Pod 状态
kubectl get pods -n php-test
# 查看应用日志
kubectl logs -f deployment/php-app -n php-test
# 回滚到上一个版本
argocd app rollback php-test
```
## 🎉 完成
现在你的 PHP 测试项目已经配置好 GitOps 自动部署!
每次修改代码后,只需运行 `./gitops-deploy.sh`ArgoCD 会自动完成部署。

365
php-test/README.md Normal file
View File

@@ -0,0 +1,365 @@
# 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

35
php-test/argocd-app.yaml Normal file
View File

@@ -0,0 +1,35 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: php-test
namespace: argocd
spec:
project: default
# Git 仓库配置
source:
repoURL: https://git.u9.net3w.com/fei/k3s-configs.git
targetRevision: HEAD
path: php-test/k8s
# 目标集群
destination:
server: https://kubernetes.default.svc
namespace: php-test
# 自动同步策略
syncPolicy:
automated:
prune: true # 自动删除 Git 中不存在的资源
selfHeal: true # 自动修复被手动修改的资源
allowEmpty: false
syncOptions:
- CreateNamespace=true # 自动创建命名空间
- PrunePropagationPolicy=foreground
- PruneLast=true
retry:
limit: 5
backoff:
duration: 5s
factor: 2
maxDuration: 3m

57
php-test/build-and-push.sh Executable file
View File

@@ -0,0 +1,57 @@
#!/bin/bash
set -e
echo "🔨 开始构建并推送 Docker 镜像到私有仓库..."
# 颜色定义
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# 配置
REGISTRY="registry.u9.net3w.com"
IMAGE_NAME="php-test"
TAG="${1:-latest}"
FULL_IMAGE="${REGISTRY}/${IMAGE_NAME}:${TAG}"
# 1. 构建 Docker 镜像
echo -e "${BLUE}📦 步骤 1: 构建 Docker 镜像...${NC}"
sudo docker build -t ${IMAGE_NAME}:${TAG} .
echo -e "${GREEN}✅ 镜像构建完成${NC}\n"
# 2. 标记镜像
echo -e "${BLUE}🏷️ 步骤 2: 标记镜像...${NC}"
sudo docker tag ${IMAGE_NAME}:${TAG} ${FULL_IMAGE}
echo -e "${GREEN}✅ 镜像标记完成: ${FULL_IMAGE}${NC}\n"
# 3. 登录私有仓库(如果需要)
echo -e "${BLUE}🔐 步骤 3: 登录私有仓库...${NC}"
if sudo docker login ${REGISTRY} 2>/dev/null; then
echo -e "${GREEN}✅ 登录成功${NC}\n"
else
echo -e "${YELLOW}⚠️ 登录失败,尝试不使用认证推送...${NC}\n"
fi
# 4. 推送镜像到私有仓库
echo -e "${BLUE}📤 步骤 4: 推送镜像到私有仓库...${NC}"
sudo docker push ${FULL_IMAGE}
echo -e "${GREEN}✅ 镜像推送完成${NC}\n"
# 5. 显示镜像信息
echo -e "${BLUE}📊 镜像信息:${NC}"
echo "================================"
echo "Registry: ${REGISTRY}"
echo "Image: ${IMAGE_NAME}"
echo "Tag: ${TAG}"
echo "Full Image: ${FULL_IMAGE}"
echo ""
echo -e "${GREEN}🎉 构建和推送完成!${NC}"
echo ""
echo -e "${YELLOW}下一步:${NC}"
echo " 1. 提交代码到 Git: git add . && git commit -m 'Update image' && git push"
echo " 2. ArgoCD 会自动检测并部署新版本"
echo " 3. 或手动触发同步: kubectl apply -f argocd-app.yaml"

68
php-test/deploy.sh Executable file
View File

@@ -0,0 +1,68 @@
#!/bin/bash
set -e
echo "🚀 开始部署 PHP 测试项目到 k3s..."
# 颜色定义
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 1. 构建 Docker 镜像
echo -e "${BLUE}📦 步骤 1: 构建 Docker 镜像...${NC}"
docker build -t php-test:latest .
echo -e "${GREEN}✅ Docker 镜像构建完成${NC}\n"
# 2. 导入镜像到 k3s
echo -e "${BLUE}📥 步骤 2: 导入镜像到 k3s...${NC}"
docker save php-test:latest | sudo k3s ctr images import -
echo -e "${GREEN}✅ 镜像导入完成${NC}\n"
# 3. 应用 ConfigMap
echo -e "${BLUE}⚙️ 步骤 3: 应用配置文件...${NC}"
kubectl apply -f k8s/mysql-configmap.yaml
kubectl apply -f k8s/php-configmap.yaml
echo -e "${GREEN}✅ ConfigMap 应用完成${NC}\n"
# 4. 部署 MySQL
echo -e "${BLUE}🗄️ 步骤 4: 部署 MySQL 数据库...${NC}"
kubectl apply -f k8s/mysql-deployment.yaml
echo -e "${GREEN}✅ MySQL 部署完成${NC}\n"
# 5. 等待 MySQL 就绪
echo -e "${YELLOW}⏳ 等待 MySQL 就绪...${NC}"
kubectl wait --for=condition=ready pod -l app=mysql -n php-test --timeout=120s
echo -e "${GREEN}✅ MySQL 已就绪${NC}\n"
# 6. 部署 PHP 应用
echo -e "${BLUE}🐘 步骤 5: 部署 PHP 应用...${NC}"
kubectl apply -f k8s/php-deployment.yaml
echo -e "${GREEN}✅ PHP 应用部署完成${NC}\n"
# 7. 等待 PHP 应用就绪
echo -e "${YELLOW}⏳ 等待 PHP 应用就绪...${NC}"
kubectl wait --for=condition=ready pod -l app=php-app -n php-test --timeout=120s
echo -e "${GREEN}✅ PHP 应用已就绪${NC}\n"
# 8. 显示部署信息
echo -e "${BLUE}📊 部署信息:${NC}"
echo "================================"
kubectl get all -n php-test
echo ""
# 9. 获取访问地址
NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}')
NODE_PORT=30080
echo -e "${GREEN}🎉 部署成功!${NC}"
echo ""
echo -e "${BLUE}访问地址:${NC}"
echo -e " http://${NODE_IP}:${NODE_PORT}"
echo -e " http://localhost:${NODE_PORT}"
echo ""
echo -e "${YELLOW}提示:${NC}"
echo " - 查看 Pod 状态: kubectl get pods -n php-test"
echo " - 查看日志: kubectl logs -f deployment/php-app -n php-test"
echo " - 删除部署: ./undeploy.sh"

75
php-test/gitops-deploy.sh Executable file
View File

@@ -0,0 +1,75 @@
#!/bin/bash
# GitOps 自动部署脚本
# 用于快速部署 PHP 测试项目到 k3s 集群
set -e
echo "🚀 GitOps 自动部署流程启动..."
# 颜色定义
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
# 配置
REGISTRY="registry.u9.net3w.com"
IMAGE_NAME="php-test"
TAG="${1:-latest}"
# 步骤 1: 构建并推送镜像
echo -e "${BLUE}📦 步骤 1/4: 构建并推送 Docker 镜像...${NC}"
./build-and-push.sh ${TAG}
echo ""
# 步骤 2: 提交到 Git
echo -e "${BLUE}📝 步骤 2/4: 提交代码到 Git...${NC}"
git add .
if git diff --staged --quiet; then
echo -e "${YELLOW}⚠️ 没有需要提交的更改${NC}"
else
COMMIT_MSG="${2:-Update PHP test app - $(date '+%Y-%m-%d %H:%M:%S')}"
git commit -m "${COMMIT_MSG}"
echo -e "${GREEN}✅ 代码已提交${NC}"
fi
echo ""
# 步骤 3: 推送到远程仓库
echo -e "${BLUE}📤 步骤 3/4: 推送到远程仓库...${NC}"
if git push; then
echo -e "${GREEN}✅ 代码已推送到远程仓库${NC}"
else
echo -e "${RED}❌ 推送失败,请检查远程仓库配置${NC}"
echo -e "${YELLOW}提示: 使用 'git remote -v' 查看远程仓库配置${NC}"
exit 1
fi
echo ""
# 步骤 4: 应用 ArgoCD 配置
echo -e "${BLUE}🎯 步骤 4/4: 应用 ArgoCD 配置...${NC}"
if kubectl apply -f argocd-app.yaml; then
echo -e "${GREEN}✅ ArgoCD Application 已创建/更新${NC}"
else
echo -e "${YELLOW}⚠️ ArgoCD Application 应用失败,可能已存在${NC}"
fi
echo ""
# 显示部署信息
echo -e "${GREEN}🎉 GitOps 部署流程完成!${NC}"
echo ""
echo -e "${BLUE}📊 部署信息:${NC}"
echo "================================"
echo "镜像: ${REGISTRY}/${IMAGE_NAME}:${TAG}"
echo "Git 仓库: $(git remote get-url origin 2>/dev/null || echo '未配置')"
echo "ArgoCD: https://argocd.u9.net3w.com"
echo "应用访问: https://php.u9.net3w.com"
echo ""
echo -e "${YELLOW}⏳ ArgoCD 将在 3 分钟内自动同步部署${NC}"
echo ""
echo -e "${BLUE}监控命令:${NC}"
echo " - 查看 ArgoCD 应用: kubectl get application php-test -n argocd"
echo " - 查看 Pod 状态: kubectl get pods -n php-test"
echo " - 查看部署日志: kubectl logs -f deployment/php-app -n php-test"
echo " - 手动同步: argocd app sync php-test"

25
php-test/k8s/ingress.yaml Normal file
View File

@@ -0,0 +1,25 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: php-app
namespace: php-test
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
traefik.ingress.kubernetes.io/router.entrypoints: websecure
spec:
ingressClassName: traefik
tls:
- hosts:
- php.u9.net3w.com
secretName: php-app-tls
rules:
- host: php.u9.net3w.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: php-app
port:
number: 80

View File

@@ -0,0 +1,16 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-init-sql
namespace: php-test
data:
init.sql: |
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;

View File

@@ -0,0 +1,96 @@
apiVersion: v1
kind: Namespace
metadata:
name: php-test
---
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
namespace: php-test
type: Opaque
stringData:
MYSQL_ROOT_PASSWORD: "rootpassword"
MYSQL_DATABASE: "test_db"
MYSQL_USER: "phpuser"
MYSQL_PASSWORD: "phppassword"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
namespace: php-test
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: php-test
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_ROOT_PASSWORD
- name: MYSQL_DATABASE
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_DATABASE
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_USER
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_PASSWORD
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
- name: init-sql
mountPath: /docker-entrypoint-initdb.d
volumes:
- name: mysql-storage
persistentVolumeClaim:
claimName: mysql-pvc
- name: init-sql
configMap:
name: mysql-init-sql
---
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: php-test
spec:
selector:
app: mysql
ports:
- port: 3306
targetPort: 3306
clusterIP: None

View File

@@ -0,0 +1,18 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: php-config
namespace: php-test
data:
config.php: |
<?php
// 数据库配置
define('DB_HOST', 'mysql.php-test.svc.cluster.local');
define('DB_NAME', 'test_db');
define('DB_USER', 'phpuser');
define('DB_PASS', 'phppassword');
define('DB_CHARSET', 'utf8mb4');
// 错误报告设置(开发环境)
error_reporting(E_ALL);
ini_set('display_errors', 1);

View File

@@ -0,0 +1,58 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-app
namespace: php-test
spec:
replicas: 2
selector:
matchLabels:
app: php-app
template:
metadata:
labels:
app: php-app
spec:
containers:
- name: php-app
image: registry.u9.net3w.com/php-test:latest
imagePullPolicy: Always
ports:
- containerPort: 80
name: http
volumeMounts:
- name: php-config
mountPath: /var/www/html/config.php
subPath: config.php
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
volumes:
- name: php-config
configMap:
name: php-config
---
apiVersion: v1
kind: Service
metadata:
name: php-app
namespace: php-test
spec:
type: NodePort
selector:
app: php-app
ports:
- port: 80
targetPort: 80
nodePort: 30080
protocol: TCP
name: http

39
php-test/undeploy.sh Executable file
View File

@@ -0,0 +1,39 @@
#!/bin/bash
set -e
echo "🗑️ 开始清理 PHP 测试项目..."
# 颜色定义
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 1. 删除 PHP 应用
echo -e "${BLUE}🐘 删除 PHP 应用...${NC}"
kubectl delete -f k8s/php-deployment.yaml --ignore-not-found=true
echo -e "${GREEN}✅ PHP 应用已删除${NC}\n"
# 2. 删除 MySQL
echo -e "${BLUE}🗄️ 删除 MySQL 数据库...${NC}"
kubectl delete -f k8s/mysql-deployment.yaml --ignore-not-found=true
echo -e "${GREEN}✅ MySQL 已删除${NC}\n"
# 3. 删除 ConfigMap
echo -e "${BLUE}⚙️ 删除配置文件...${NC}"
kubectl delete -f k8s/mysql-configmap.yaml --ignore-not-found=true
kubectl delete -f k8s/php-configmap.yaml --ignore-not-found=true
echo -e "${GREEN}✅ ConfigMap 已删除${NC}\n"
# 4. 删除命名空间(可选)
echo -e "${YELLOW}是否删除命名空间 php-test? (y/N)${NC}"
read -r response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]; then
kubectl delete namespace php-test --ignore-not-found=true
echo -e "${GREEN}✅ 命名空间已删除${NC}\n"
else
echo -e "${BLUE}保留命名空间 php-test${NC}\n"
fi
echo -e "${GREEN}🎉 清理完成!${NC}"

60
php-test/watch.php Executable file
View File

@@ -0,0 +1,60 @@
#!/usr/bin/env php
<?php
/**
* PHP 文件监控脚本 - 用于开发环境热更新
* 监控 PHP 文件变化并自动触发浏览器刷新
*/
echo "🔥 PHP 热更新监控已启动...\n";
echo "监控目录: " . __DIR__ . "\n";
echo "按 Ctrl+C 停止监控\n\n";
$watchedFiles = [];
$extensions = ['php', 'html', 'css', 'js'];
function scanDirectory($dir, $extensions) {
$files = [];
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS)
);
foreach ($iterator as $file) {
if ($file->isFile()) {
$ext = strtolower($file->getExtension());
if (in_array($ext, $extensions)) {
$files[$file->getPathname()] = $file->getMTime();
}
}
}
return $files;
}
// 初始化文件列表
$watchedFiles = scanDirectory(__DIR__, $extensions);
echo "正在监控 " . count($watchedFiles) . " 个文件...\n\n";
while (true) {
sleep(1);
$currentFiles = scanDirectory(__DIR__, $extensions);
// 检查文件变化
foreach ($currentFiles as $file => $mtime) {
if (!isset($watchedFiles[$file])) {
echo "[" . date('H:i:s') . "] ✨ 新文件: " . basename($file) . "\n";
$watchedFiles[$file] = $mtime;
} elseif ($watchedFiles[$file] !== $mtime) {
echo "[" . date('H:i:s') . "] 🔄 文件已更新: " . basename($file) . "\n";
$watchedFiles[$file] = $mtime;
}
}
// 检查删除的文件
foreach ($watchedFiles as $file => $mtime) {
if (!isset($currentFiles[$file])) {
echo "[" . date('H:i:s') . "] 🗑️ 文件已删除: " . basename($file) . "\n";
unset($watchedFiles[$file]);
}
}
}