PHP内置Web服务器不能在脚本中调用,因为它是阻塞式CLI工具,执行后不返回控制权;需用nohup+&后台启动并配合探活和pkill清理。
PHP 内置 Web 服务器(php -S)不是用来“被调用”的服务端组件,它本身就是一个独立运行的命令行 HTTP 服务进程;你无法在 PHP 脚本里用 exec() 或 shell_exec() “启动它并立刻处理请求”,因为它的设计目标是开发调试,

内置服务器是阻塞式 CLI 工具:一旦执行 php -S localhost:8000,PHP 进程就卡在那里监听请求,不会返回控制权给上层脚本。试图用 exec() 启动它会导致父脚本挂起,或因后台进程管理缺失而立即退出。
$_SERVER['SERVER_SOFTWARE'] 会显示 PHP Built-in Server,但这是只读标识,不可编程干预只能通过 shell 进程控制实现,且必须分离前后台——典型做法是用 nohup + & 启动,再用 lsof / netstat 或简单 HTTP 探活确认是否就绪。
nohup php -S localhost:8000 -t ./public/ router.php > /dev/null 2>&1 & sleep 1 curl -sf http://localhost:8000/health || echo "server not ready"
-t 明确文档根目录,否则默认为当前路径,易出路径错误router.php)必须存在且返回 true 才能接管请求,否则 404lsof -i :8000 | grep LISTEN 检查端口占用,macOS 改用 lsof -iTCP:8000 -sTCP:LISTEN
pkill -f "php -S localhost:8000" 清理,避免端口残留若需要可靠集成进 PHPUnit 或 CI 流程,推荐改用 symfony/web-server-bundle(已弃用)或现代替代品如 spiral/roadrunner、laravel/sail,或者干脆用 Python 的 http.server 做临时静态服务:
python3 -m http.server 8000 --directory ./public &
.htaccess、mod_rewrite 完全无感知,所有重写逻辑必须手写进路由文件start /B 替代 &,但进程管理更脆弱,建议 CI 环境统一用 Linux真正麻烦的不是怎么启动它,而是如何确保它在测试失败后一定被杀掉——端口冲突和僵尸进程才是高频故障点。