PHP单体转微服务要改哪些地方_迁移思路【教程】


微服务拆分后应弃用$_SESSION,改用JWT无状态认证;$_COOKIE仅存非敏感字段并设Domain/SameSite;数据库事务改用消息队列实现最终一致性;公共代码抽为独立Composer包;各服务独立部署、配置FPM参数并提供标准健康检查接口。

单体 PHP 里的 $_SESSION$_COOKIE 怎么办

微服务拆分后,用户会跨多个服务(如 auth-serviceorder-service)请求,而 PHP 默认的文件或 Redis session 存储只绑定在单一服务进程里,其他服务无法读取 $_SESSION。硬共享 session 存储(比如全用同一个 Redis DB + 相同 session_id)看似可行,但实际会引发并发写冲突、过期策略不一致、敏感数据泄露等问题。

更稳妥的做法是彻底弃用 $_SESSION,改用无状态认证:

  • 登录成功后,auth-service 签发 JWT(含 user_idroleexp),通过 HTTP Header(如 Authorization: Bearer xxx)透传给下游服务
  • 所有服务统一校验 JWT 签名和有效期,不再依赖 session 存储
  • $_COOKIE 仅保留非敏感字段(如语言偏好),且必须设置 DomainSameSite 属性适配多子域(如 Domain=.example.com

数据库连接和事务怎么拆

原单体常共用一个 MySQL 实例,用事务包裹跨模块操作(如“扣库存 + 写订单 + 发通知”)。微服务要求每个服务独占数据库 Schema,跨服务事务无法靠本地 START TRANSACTION 保证一致性。

必须改成最终一致性方案:

  • 订单服务创建订单时,只写本地 orders 表,状态设为 pending
  • 通过消息队列(如 RabbitMQ 或 Kafka)异步发 inventory.deduct 消息给库存服务
  • 库存服务处理成功后,再发 order.confirmed 回调;失败则触发补偿任务(如自动取消订单)
  • 避免在 PHP-FPM 中直接调用其他服务的 HTTP 接口做同步事务——超时、级联失败风险极高

原来用 require_once 引入的公共函数库怎么复用

单体里把工具函数、模型类放在 app/Helpers/app/Models/ 下,用 require_once 或 Composer 自动加载。微服务中这些代码不能直接跨服务引用,否则形成强耦合和部署依赖。

正确做法是分层抽象:

  • 把通用逻辑(如密码哈希、ID 生成、HTTP 客户端封装)抽成独立 Composer 包(如 myorg/php-common-utils),发布到私有 Packagist 或 Git repo,各服务按需 composer require
  • 领域模型(如 UserOrder)**不要共享类**,各服务定义自己的 DTO 或 request struct,通过 API Schema(OpenAPI)或 Protobuf 明确约定字段和类型
  • 禁止在服务 A 的代码里 new ServiceBClient() 调用服务 B——应通过 API Gateway 统一路由,或使用 SDK 封装(SDK 只负责 HTTP 请求构造,不包含业务逻辑)

PHP-FPM 配置和部署方式必须变

单体通常一个 Nginx + 一组 PHP-FPM 进程跑全部逻辑;微服务需要每个服务独立部署、扩缩容、监控。这意味着:

  • 每个服务必须有自己的 Dockerfile,基于 php:8.2-cliphp:8.2-apache 构建,不共用同一套 FPM 配置
  • Nginx 不再直接代理 PHP-FPM,而是作为 API Gateway,用 upstream 分发请求到不同服务的容器(如 auth-service:8080order-service:8080
  • FPM 的 pm.max_childrenpm.start_servers 等参数要按服务负载单独调优——例如日志服务可设低内存限制,订单服务需更高并发连接数
  • 健康检查接口(如 /healthz)必须返回 JSON 格式、明确状态码,供 Kubernetes 或 Consul 做服务发现
GET /healthz
HTTP/1.1 200 OK
Content-Type: application/json

{"status":"ok","timestamp":1717023456,"service":"order-service"}

真正难的不是改代码,是改协作习惯:接口变更要先更新 OpenAPI 文档,数据库 schema 变更必须配套迁移脚本并测试回滚路径,任何服务都不能假设其他服务永远可用——超时、重试、熔断得写进 PHP 代码里,而不是靠运维兜底。


# mysql  # php  # redis  # js  # git  # json  # docker  # composer  # apache  # nginx  # rabbitmq  # gateway  # kafka  # 封装  # require  # Session  # 接口  # Struct  # 并发  # 异步  # consul  # 数据库  # kubernetes  # http  # 自己的  # 放在  # 多个  # 设为  # 更高  # 要先  # 极高  # 绑定  # 回调  # 再发 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: C++如何将C风格字符串(char*)转换为std::string?(代码示例)  Win11怎么硬盘分区 Win11新建磁盘分区详细教程【步骤】  Python对象比较与排序_魔术方法解析【教程】  Win11怎么关闭用户账户控制UAC_Windows11更改通知设置等级  Win11无法拖拽文件到任务栏怎么办_Win11开启拖放功能修复【方法】  Win11怎么关闭键盘按键音_Win11禁用打字声音反馈【教程】  如何在 Go 开发中正确处理本地包导入与远程模块路径的一致性问题  Windows10如何更改开机密码_Win10登录选项更改密码教程  如何在 Go 中调用动态链接库(.so)中的函数  如何用正则与预处理高效拦截带干扰符的恶意域名  Win11怎么设置夜间模式_Windows11显示设置蓝光过滤强度  获取 PHP 文件最后修改时间的正确方法  Win11怎么开启HDR模式_Windows 11高动态范围显示设置指南【详解】  如何在 Go 中判断变量是否为函数类型  Python数据挖掘进阶教程_分类回归与聚类案例解析  PHP主流架构如何做单元测试_工具与流程【详解】  php查询数据怎么导出csv_查询结果转csv文件保存【操作】  Windows笔记本无法进入睡眠模式怎么办?(电源疑难解答)  php打包exe后无法读取环境变量_变量配置方法【教程】  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  PHP 中如何在函数内持久化修改引用变量的指向  如何在Golang中编写端到端测试_Golang E2E测试流程示例  PHP cURL GET请求:正确设置请求头与身份认证的完整教程  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  Windows10系统怎么查看已安装更新_Win10控制面板卸载补丁  C++中的std::shared_from_this有什么用?C++安全获取this的shared_ptr【智能指针】  如何使用Golang实现路由参数绑定_使用Mux和Request解析路径变量  VSC怎样在VSC中调试PHPAPI_接口调试技巧【详解】  Windows10如何彻底关闭自动更新_Win10服务与组策略双重禁用  Win11如何设置环境变量 Win11添加和修改系统与用户变量【教程】  Win10怎样设置多显示器_Win10多显示器扩展设置【攻略】  MAC怎么在照片中添加水印_MAC自带编辑工具文字水印叠加【方法】  Win11怎样激活系统密钥_Win11系统密钥激活步骤【攻略】  Win11怎么检查TPM2.0模块_Windows11受信任平台模块开启状态查询  Mac的访达(Finder)怎么用_Mac文件管理入门教程【详解】  Python 中将 ISO 8601 时间戳转换为日期并计算日期差值的完整教程  Win11怎么开启游戏工具栏_Windows11 Xbox Game Bar快捷键  如何使用Golang实现云原生应用弹性伸缩_自动应对流量变化  MAC的“接续互通”功能无法使用怎么办_MAC检查蓝牙、Wi-Fi和相同Apple ID登录  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  Win11怎么查看激活状态_查询Windows 11是否已永久激活【详解】  Win11怎么设置单手模式_Win11触控键盘布局调整教程【技巧】  php订单日志怎么记录发货_php记录订单发货操作日志指南【指南】  短链接怎么自定义还原php_修改解码规则适配需求【汇总】  如何在 Go 中正确测试带 Cookie 的 HTTP 请求  Win11时间怎么同步到原子钟 Win11高精度时间同步设置【指南】  Win11怎么关闭触控板_Win11笔记本禁用触摸板快捷键  Python集合操作技巧_高效去重解析【教程】  Win11怎么清理C盘系统错误报告_Win11清理系统错误报告技巧【教程】  如何在JavaScript中动态拼接PHP的base_url与jQuery变量 

 2025-12-27

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.