php实现mock server核心是用php -s配合路由器脚本统一入口,通过解析$_server['request_uri']匹配路径与方法,依配置数组动态返回状态码、json响应、延迟及错误,需设正确header、避免输出干扰,并支持规则外置与调试标识。

PHP 实现接口 Mock Server,核心不是写个 echo json_encode() 就完事——关键在于能快速切换响应状态、支持动态数据、拦截并记录请求、且不依赖外部服务(比如 Node.js 的 json-server 或 Python 的 http.server)。纯 PHP 内置 php -S 就能跑起来,但默认路由和响应控制太弱,得补一层轻量路由+规则匹配逻辑。
用 php -S 启动时如何接管所有请求?
内置服务器默认只响应真实存在的文件,index.php 被当成静态资源返回源码。必须用 -t 指定文档根目录,并通过路由器脚本(如 router.php)统一入口:
php -S localhost:8000 router.php
其中 router.php 必须返回 true 才算“已处理”,否则会尝试找对应路径的静态文件。常见错误是忘记 return true;,导致 404 或直接输出 PHP 源码。
- 路由器文件必须放在命令行当前目录,或显式指定绝对路径
-
$_SERVER['REQUEST_URI']包含完整路径(含 query string),需手动parse_url()提取 path - 不要在路由器里
exit或die,用return true表明已响应
怎么让同一个 URL 返回不同 HTTP 状态码和响应体?
靠解析 URL 参数或请求头做条件分支最简单,比如 /api/user?id=123&status=404 或带 X-Mock-Status: 500 头。别硬编码一堆 if 块,用配置数组驱动更可控:
$rules = [
'/api/user' => [
'GET' => [
'404' => ['message' => 'not found'],
'200' => ['id' => 123, 'name' => 'mock-user'],
],
],
];
实际匹配时优先查 method + path + status 参数,没命中再 fallback 到默认 200。注意:PHP 的 header() 必须在任何输出前调用,所以响应体生成要延迟到 header() 之后。
- 用
http_response_code(404)设置状态码,比header('HTTP/1.1 404 Not Found')更可靠 - 避免意外输出空格或 BOM,推荐在
router.php开头加ob_start()+ob_end_clean() - JSON 响应记得设
header('Content-Type: application/json; charset=utf-8')
如何模拟延迟、随机失败、请求体校验等真实场景?
Mock 不是只返数据,更要模拟网络不可靠性。比如加 sleep(rand(1, 3)) 模拟慢接口;用 rand(1, 10) === 1 触发 10% 概率 500;读 file_get_contents('php://input') 校验 JSON 字段是否存在。
容易被忽略的是:POST/PUT 请求的原始 body 可能是 form-data、raw JSON 或 XML,$_POST 只对 application/x-www-form-urlencoded 有效。真要校验结构,得先判断 Content-Type 头再解析。
- 延迟用
usleep(500000)比sleep(1)更精细,避免阻塞整个进程 - 随机失败建议加开关参数(如
?mock-fail=on),方便测试时稳定复现 - 校验失败时,用
http_response_code(400)并返回明确错误字段,别只打日志
真正难的不是返回 mock 数据,而是让前端开发者能一眼看出「这个响应是谁配的、为什么是这个状态、下次怎么改」。所以规则最好从独立 JSON 文件加载,而不是写死在 PHP 里;每个响应加 X-Mock-From: rules_v2.json 头,调试时省一半时间。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











