PHP微服务:从何入手并保持清醒
\n\n您是否曾看着一个膨胀到20万行代码的PHP单体应用,内心感到无比压抑?一次提交——整个系统就崩溃。购物车模块的一个错误——整个网站就瘫痪。熟悉吗?欢迎加入单体应用幸存者俱乐部。
\n\n但好消息是:PHP微服务并非高深莫测的火箭科学。它只是一组小型、独立的应用程序,通过HTTP或消息队列相互通信。是的,PHP非常适合这个任务。不相信?Laravel、Symfony甚至“纯”PHP都能很好地扮演微服务的角色。
\n\n在本文中,我将向您展示PHP微服务架构,并附上真实代码示例。您将了解从何入手、选择哪些工具以及如何避免踩坑。开始吧!
\n\n用通俗语言解释PHP微服务
\n\n想象一家披萨店。单体应用就像一位厨师做所有事情:和面、切香肠、烘烤、包装、接单、洗碗。如果厨师生病了——披萨店就关门。微服务则像您有专门的和面师傅、专门的馅料师傅、专门的烘烤师傅和专门的配送员。每个人独立工作,如果“和面师傅”生病了,其他人仍能继续工作。
\n\n在PHP世界中,这看起来像这样:
\n\n- \n
- 用户服务 — 注册、登录、个人资料 \n
- 订单服务 — 创建、支付、状态管理 \n
- 通知服务 — 邮件、短信、推送通知 \n
- API网关 — 客户端的统一入口 \n
每个服务都是一个独立的PHP应用程序,拥有自己的数据库、自己的代码仓库和自己的业务逻辑。所有这些协同工作,构成了PHP微服务架构。
\n\n何时应该转向微服务?
\n\n说实话:微服务并非万能灵药。如果您只有3000个用户和10个页面——请忘记它。您需要的是单体应用。但如果出现以下情况:
\n\n- \n
- 开发团队扩大到5人以上 \n
- 每次部署小改动都提心吊胆 \n
- 单个数据库成为瓶颈 \n
- 应用的不同部分需要不同技术(例如,搜索用Elasticsearch,订单用PostgreSQL) \n
……那么PHP微服务就是您的选择。
\n\n从何入手:基于PHP的基础微服务
\n\n我们从简单的开始。创建一个返回用户列表的微服务。这将是一个PHP REST API微服务。
\n\n第一步:项目结构
\n\nuser-service/\n├── public/\n│ └── index.php\n├── src/\n│ ├── Controllers/\n│ │ └── UserController.php\n│ ├── Models/\n│ │ └── User.php\n│ └── Services/\n│ └── UserService.php\n├── config/\n│ └── database.php\n├── composer.json\n└── .env\n\n第二步:入口文件 (index.php)
\n\n<?php\n// public/index.php\nrequire_once __DIR__ . '/../vendor/autoload.php';\n\nuse Symfony\\Component\\Dotenv\\Dotenv;\nuse App\\Controllers\\UserController;\n\n$dotenv = new Dotenv();\n$dotenv->load(__DIR__ . '/../.env');\n\n$uri = $_SERVER['REQUEST_URI'];\n$method = $_SERVER['REQUEST_METHOD'];\n\n// 简单路由器\nif ($uri === '/api/users' && $method === 'GET') {\n $controller = new UserController();\n echo json_encode($controller->index());\n} elseif (preg_match('/\\/api\\/users\\/(\\d+)/', $uri, $matches) && $method === 'GET') {\n $controller = new UserController();\n echo json_encode($controller->show($matches[1]));\n} else {\n http_response_code(404);\n echo json_encode(['error' => 'Not found']);\n}\n\n第三步:控制器
\n\n<?php\n// src/Controllers/UserController.php\nnamespace App\\Controllers;\n\nuse App\\Services\\UserService;\n\nclass UserController\n{\n