0

0

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

蓮花仙者

蓮花仙者

发布时间:2025-12-27 23:49:02

|

623人浏览过

|

来源于php中文网

原创

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

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

单体 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 保证一致性。

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

立即学习PHP免费学习笔记(深入)”;

MindShow
MindShow

MindShow官网 | AI生成PPT,快速演示你的想法

下载
  • 订单服务创建订单时,只写本地 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 代码里,而不是靠运维兜底。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
composer是什么插件
composer是什么插件

Composer是一个PHP的依赖管理工具,它可以帮助开发者在PHP项目中管理和安装依赖的库文件。Composer通过一个中央化的存储库来管理所有的依赖库文件,这个存储库包含了各种可用的依赖库的信息和版本信息。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

161

2023.12.25

mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

686

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

513

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

287

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

519

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

267

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

392

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

542

2023.08.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 846人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号