设计模式原则
设计模式原则 设计模式的原则是理解和使用设计模式的基石。这些原则是面向对象设计的核心指导思想,设计模式本身就是这些原则在特定场景下的具体体现。 最重要的设计原则是 SOLID 原则,此外还有一些其他关键原则。 一、 SOLID 原则 SOLID 原则是五个最常用、最经典的设计原则,由 Robert C. Martin 提出。 1. 单一职责原则 核心思想: 一个类应该只有一个引起变化的原因。 详细解释:一个类只负责一项职责或功能。如果一個类承担的功能过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。 比喻: 一家餐厅,厨师负责做饭,服务员负责点菜和上菜,清洁工负责打扫。如果他们职责混杂,效率就会低下。 违反示例: 一个 UserService 类,既负责用户信息的增删改查,又负责将用户数据导出为PDF报表,还负责发送邮件通知。 修正: 将 UserService 拆分为 UserService(用户业务逻辑)、UserReportGenerator(报表生成)和 EmailService(邮件服务)。 2. 开闭原则 核心思想: 软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。 详细解释: 当需求发生变化时,我们应该通过添加新的代码来扩展功能,而不是修改已有的、已经工作正常的代码。这是最重要的原则,是很多设计模式的目标。 比喻: 一台电脑,你可以扩展USB设备(鼠标、键盘、硬盘),而无需为了支持新设备而拆开主机修改主板。 违反示例: 一个 AreaCalculator 类,有一个 calculate 方法,里面用 if-else 来判断是圆形还是矩形来计算面积。如果要增加三角形,就必须修改这个类的代码。 修正: 定义一个 Shape 接口,包含 calculateArea 方法。让 Circle 和 Rectangle 类实现这个接口。AreaCalculator 只需遍历 Shape 列表调用其方法即可。要新增三角形,只需创建 Triangle 类实现 Shape,无需修改任何现有类。 3. 里氏替换原则 核心思想: 所有引用基类的地方必须能透明地使用其子类的对象。 详细解释: 子类必须能够完全替代它们的父类,而不产生任何错误或意外的行为。也就是说,子类只能在保持原有行为的基础上进行扩展,而不能覆盖或改变父类的核心行为。 比喻: 你父亲会开车,你作为儿子继承了他,你也会开车(保持了父亲的行为),但你可能会开得更快或者还会修车(扩展),你绝不能把“开车”这个行为重定义为“游泳”。 违反示例: Rectangle 类有 setWidth 和 setHeight 方法。Square 类继承 Rectangle,并重写了 setWidth 和 setHeight,使其同时设置宽和高。那么,一个接收 Rectangle 参数并调整其宽高的函数,如果传入一个 Square 对象,就会得到错误的结果。 修正: 重新考虑继承关系,或者让 Rectangle 和 Square 都实现一个 Shape 接口,而不是使用继承。 4....
MySQL 中主要的日志类型
MySQL 中主要的日志类型 MySQL 提供了多种日志类型,每种都有其特定的目的和格式。理解这些日志对于数据库管理、性能调优、数据恢复和故障排查至关重要。 下面我将详细介绍 MySQL 中主要的日志类型及其格式 总结概览 日志类型 主要目的 格式 是否默认开启 错误日志 记录 MySQL 启动、运行、停止时的错误、警告和提示信息。 文本格式 是 二进制日志 记录所有更改数据的语句,用于主从复制和数据恢复。 STATEMENT, ROW, MIXED 否 (8.0默认开启) 通用查询日志 记录所有到达 MySQL 的客户端连接和执行的语句。 文本格式 / CSV 格式 否 慢查询日志 记录执行时间超过指定阈值的查询,用于性能优化。 文本格式 / CSV 格式 否 重做日志 InnoDB 特有的,用于保证事务的持久性和崩溃恢复。 物理格式(二进制) 是 回滚日志 InnoDB 特有的,用于保证事务的原子性和 MVCC。 逻辑格式 是 详细解析 1. 错误日志 这是 DBA 首先需要查看的日志,当数据库出现任何异常时,它通常是排查问题的起点。 内容:启动/关闭信息、错误信息、警告信息、在复制环境中从服务器线程的启动信息等。 格式:纯文本格式,易于阅读。 配置参数: log_error:指定错误日志文件的位置。 示例内容: 2023-10-27T08:00:00.000000Z 0 \[Note\] Server started. 2023-10-27T08:01:23.456789Z 5 \[Warning\] Aborted connection 5 to db: 'test' user: 'root' host: 'localhost' 2....
Drone CICD自动化部署指南
Drone CICD自动化部署指南 一、Drone核心优势与架构设计 1.1 为什么选择Drone 官方文档 Drone作为轻量级云原生CI/CD工具,相比Jenkins具有显著优势: 资源占用低:基于Docker容器化运行,单个Pipeline平均内存消耗<100MB 云原生支持:原生集成Kubernetes、Docker等云原生技术栈 配置即代码:完全通过.drone.yml定义流程,版本可控 高性能:测试显示并发构建能力比Jenkins高3-5倍16 1.2 企业级架构设计 [Gitee/GitHub] → [Drone Server] → [Docker Runner] (开发环境) ↘ [K8s Runner] (生产环境) ↘ [SSH Runner] (特殊场景) 二、 注册 OAuth 应用 (Gitee为例) 登录 Gitee → 点击右上角头像 → 设置 → 第三方应用 → 创建应用 填写应用信息: 应用名称:Drone CI(自定义) 应用描述:Drone CI/CD 工具(自定义) 授权回调地址:http://你的服务器IP或域名/login(必须正确,否则无法登录) 应用主页:http://你的服务器IP或域名 权限选择:(最少权限原则)user_info,projects,pull_requests,hooks 提交后,记录生成的 Client ID 和 Client Secret(后续配置需要) 三、安装 Drone 服务器和 Runner Drone 由两部分组成: Drone Server:管理项目、接收仓库事件、协调任务 Drone Runner:执行流水线任务(编译、测试、部署等) 3.1 手动启动 Drone Server docker run -d \ --name drone-server \ --restart always \ -p 80:80 \ # 端口映射(生产环境建议加 HTTPS) -v /var/lib/drone:/data \ # 数据持久化 -e DRONE_RPC_SECRET=your_agent_secret \ # 自定义密钥(与 Runner 保持一致) -e DRONE_GITEE_CLIENT_ID=你的Gitee Client ID \ # 替换为 Gitee 应用的 Client ID -e DRONE_GITEE_CLIENT_SECRET=你的Gitee Client Secret \ # 替换为 Gitee 应用的 Secret -e DRONE_GITEE_SERVER=https://gitee....
轻量级容器编排工具指南
轻量级容器编排工具指南 在 Docker 环境中,除了 K8s,还有多种轻量级方案可以实现服务自动重启、健康检查等功能,特别适合单机或中小规模部署。 一、简单方案 1.1 Docker 自身的重启策略(最基础方案) Docker Engine 内置了容器重启策略,可直接在启动容器时配置,实现容器退出后自动重启。 常用重启策略: --restart always:无论容器因何种原因退出(包括正常退出),总是自动重启。 --restart on-failure[:max-retries]:仅在容器以非 0 状态码退出时重启,可选最大重试次数(如on-failure:3最多重启 3 次)。 --restart unless-stopped:除非手动执行docker stop,否则始终重启(包括 Docker daemon 重启时) 示例: # 启动PHP容器,配置always重启策略 docker run -d \ --name php-app \ --restart always \ # 核心:容器挂掉后自动重启 -p 80:80 \ -v /path/to/php/code:/var/www/html \ php:8.2-apache 优势: 零依赖,直接使用 Docker 原生功能,适合单机部署。 局限: 仅能监控容器本身是否存活,无法检测应用内部故障(如 PHP-FPM 假死但容器仍运行)。 1.2 ocker Compose(适合多容器应用) 如果 项目依赖其他服务(如 MySQL、Redis),可使用docker-compose管理,通过配置restart参数实现自动重启,同时支持健康检查。 docker-compose.yml示例: version: '3.8' services: php-app: image: php:8.2-apache restart: always # 容器退出后自动重启 ports: - "80:80" volumes: - ....
Kong+Konga+Consul
Kong+Konga+Consul 安装和使用 此处使用Docker安装方式 一、 安装Kong kong具体使用可参考另一篇文章:Kong API网关 为了确保 Kong、Konga 和 Consul 能够通信,Kong 和 Konga 也需要加入到同一个网络。如果你尚未创建网络,或者希望使用新的网络,可以创建一个: docker network create kong-net 1.1 安装 PostgreSQL (Kong 的数据库) Kong 需要 PostgreSQL 来存储其配置数据 docker run -d --name kong-database \ --network=kong-net \ -p 5432:5432 \ -e "POSTGRES_USER=kong" \ -e "POSTGRES_DB=kong" \ -e "POSTGRES_PASSWORD=kong" \ postgres:13 –network=kong-net: 确保数据库与 Kong、Consul 在同一网络。 -e 环境变量:设置数据库的用户名、数据库名和密码。 建议使用 PostgreSQL 9.6 或更高版本,这里使用了 13 版本。 1.2 初始化 Kong 数据库 运行一个临时容器来执行数据库迁移: docker run --rm \ --network=kong-net \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=kong-database" \ -e "KONG_PG_USER=kong" \ -e "KONG_PG_PASSWORD=kong" \ kong:3....
PHPUnit使用指南
PHPUnit 使用指南 一、介绍 PHPUnit 是 PHP 领域最流行的单元测试框架,它受到 JUnit 的启发,为 PHP 开发者提供了编写和运行单元测试的工具和方法。使用 PHPUnit 可以带来以下好处: 验证代码的正确性,确保函数和方法按预期工作 便于代码重构,修改后可以快速验证是否破坏了现有功能 帮助理解代码功能,测试用例本身就是一种文档 支持测试驱动开发 (TDD) 流程 二、安装 PHPUnit 1. 安装 PHPUnit(可以通过 composer require --dev phpunit/phpunit 安装) 2. 配置PhpStorm 运行 PHPUnit(Docker环境为例) 2.1. 配置 Docker 远程解释器 打开 PhpStorm,进入 File > Settings > Build, Execution, Deployment > Docker 在右侧选择 Docker for Windows(通常会自动检测) 点击 Apply 确认配置,确保连接成功(底部会显示 “Connection successful”) 进入 File > Settings > Languages & Frameworks > PHP 点击 CLI Interpreter 右侧的 … 按钮,点击左上角 + 号,选择 From Docker, Vagrant, VM, WSL, Remote… 选择 Docker 并找到你的 php 容器 选择容器中的 PHP 可执行文件路径(如 /usr/local/bin/php) 点击 OK 完成配置,PhpStorm 会自动检测 PHP 版本和扩展 2....
wrk 使用指南
wrk 使用指南 一、介绍 wrk 是一款现代化的 HTTP 基准测试工具,使用 C 语言编写,基于事件通知机制(如 epoll, kqueue),能够产生巨大的负载。相比 ab(apache benchmark),wrk 具有以下优势: 支持多线程 + 协程模式,能更好地利用多核 CPU 支持 LuaJIT 脚本扩展,可自定义请求生成和结果处理 性能更高,单机可轻松产生数万 QPS 提供更详细的统计信息(延迟分布等) 二、安装 wrk Linux 系统安装 # Ubuntu/Debian sudo apt install wrk -y # CentOS/RHEL sudo yum install wrk -y # 或从源码编译安装 git clone https://github.com/wg/wrk.git cd wrk make sudo cp wrk /usr/local/bin/ macos brew install wrk 三、基础使用方法 1. 基本命令格式 wrk <选项> <测试URL> 2. 常用选项说明 选项 说明 示例值 -t 使用的线程数 12 (建议设置为CPU核心数的2-4倍) -c 保持打开的连接数 100 -d 测试持续时间 30s (30秒), 2m (2分钟) -s 指定Lua脚本 post....
EFK技术栈解析及PHP应用实践
EFK 技术栈深度解析:从原理到 PHP 应用的全流程实践 日志系统是现代企业级应用不可或缺的基础设施,它如同软件系统的 “黑匣子”,记录着系统运行的每一个关键节点。在众多日志解决方案中,EFK 技术栈以其轻量级、高性能的特点,成为容器化环境和高并发场景下的首选方案。本文将从 EFK 的核心概念出发,详细阐述其安装配置流程,并结合 PHP 开发场景,展示如何将 EFK 集成到实际项目中。 一、EFK 技术栈核心概念与架构解析 EFK 是 Elasticsearch、Fluentd 和 Kibana 三个开源组件的组合缩写,作为 ELK 技术栈的优化变种,它将 Logstash 替换为更轻量级的 Fluentd,形成了更适合现代云原生环境的日志处理体系。 1.1 EFK 各组件功能定位 Elasticsearch:分布式日志存储与检索引擎 基于 Lucene 的分布式文档存储系统,支持 PB 级日志数据的存储与检索 采用倒排索引结构,实现毫秒级日志搜索响应 天生支持集群架构,通过分片和副本机制保证高可用性 提供 RESTful API 接口,方便与 PHP 等语言集成 Fluentd:高性能日志收集与处理管道 用 C 语言开发的轻量级日志收集器,内存占用仅为 Logstash 的 1/10 支持 “一次写入,多次输出” 的 Buffer 机制,确保日志不丢失 插件化架构支持 150 + 数据源,包括 PHP 应用、MySQL、Kafka 等 内置 JSON 格式标准化处理,解决多源日志格式不一致问题 Kibana:可视化日志分析与监控平台 为 Elasticsearch 提供图形化查询界面,支持 DSL 语句可视化构建 内置多种可视化组件(折线图、仪表盘、拓扑图等) 支持基于日志数据的实时告警规则配置 提供日志模式识别功能,自动发现异常日志模式 1....
PHP8新特性:JIT
PHP8新特性:JIT(Just-In-Time) 一、JIT(Just-In-Time)编译技术概述 1.1 什么是JIT编译 JIT(Just-In-Time)编译是一种动态编译技术,它在程序运行时将字节码或中间代码编译为机器码执行,而不是预先编译(AOT,Ahead-Of-Time)或纯粹解释执行。PHP 8.0首次引入了JIT编译器,这是PHP性能演进史上的重要里程碑。 1.2 PHP执行模式的演进 解释执行模式(PHP 5.x及之前): 每次请求都需要解析、编译和执行 无任何形式的持久化缓存 OPCache缓存模式(PHP 5.5+): 缓存预编译的opcode 减少重复编译开销 但仍需解释执行opcode JIT编译模式(PHP 8.0+): 将热代码(频繁执行的代码)编译为机器码 直接执行机器码,绕过解释器 1.3 JIT带来的性能提升 根据官方基准测试,JIT在某些计算密集型工作负载上可带来: 数学运算:1.5-3倍提升 字符串处理:1.2-2倍提升 框架综合性能:10-30%提升 注意:JIT对I/O密集型应用(如纯数据库CRUD)提升有限 二、PHP JIT工作原理 2.1 PHP脚本执行流程 PHP源代码 ↓ Zend编译器 (生成opcode) ↓ OPCache (缓存opcode) ↓ Zend VM解释执行 ↓ JIT编译器 (追踪热代码) ↓ 生成机器码 ↓ 直接执行机器码 2.2 JIT编译流程 代码追踪: 监控执行过程中的热代码(频繁执行的代码路径) 默认阈值:执行次数超过3次触发JIT编译 编译优化: 寄存器分配 循环优化 死代码消除 内联函数调用 机器码生成: 针对当前CPU架构生成优化后的机器码 支持x86和ARM架构 执行切换: 后续执行直接跳转到机器码 绕过Zend虚拟机解释器 2.3 JIT与OPCache的关系 协同工作: OPCache是JIT的基础 JIT只编译OPCache中缓存的opcode 内存管理: JIT使用OPCache的共享内存存储机器码 opcache....
PHP底层原理与性能优化深度解析
PHP底层原理与性能优化深度解析 一、PHP生命周期与SAPI PHP的生命周期是一个复杂但有序的过程,理解它对于性能优化至关重要。 1.1 PHP生命周期概述 PHP的生命周期可以概括为以下几个阶段: 模块初始化阶段 (MINIT) 只在PHP启动时执行一次 注册常量、类、资源类型等 所有扩展的MINIT方法被调用 请求初始化阶段 (RINIT) 每个请求开始时执行 初始化脚本运行环境 所有扩展的RINIT方法被调用 脚本执行阶段 解析、编译、执行PHP脚本 生成响应内容 请求关闭阶段 (RSHUTDOWN) 每个请求结束时执行 清理请求级资源 所有扩展的RSHUTDOWN方法被调用 模块关闭阶段 (MSHUTDOWN) PHP关闭时执行一次 清理持久化资源 所有扩展的MSHUTDOWN方法被调用 1.2 SAPI (Server API) SAPI是PHP与外部环境交互的接口层,常见的SAPI类型包括: Web服务器集成: Apache (mod_php) Nginx (PHP-FPM) IIS 命令行接口: CLI (Command Line Interface) CGI 嵌入式PHP: 嵌入到其他应用程序中 不同的SAPI实现会影响PHP的生命周期。例如: 在mod_php中,PHP作为Apache模块运行,生命周期与Apache进程绑定 在PHP-FPM中,PHP作为独立的FastCGI进程运行,可以独立管理进程池 二、OPCache原理与优化 2.1 PHP脚本执行流程 传统PHP脚本执行流程: 词法分析 (Lexing) - 将源代码转换为token流 语法分析 (Parsing) - 将token流转换为抽象语法树(AST) 编译 (Compilation) - 将AST转换为opcodes 执行 (Execution) - 执行opcodes 每次请求都需要重复这些步骤,造成大量CPU资源浪费。...