php内置服务器启动失败主因是router脚本缺失、路径错误或未正确处理静态资源;它不支持https、不读php.ini、不解析$_get、单线程且仅限开发调试。

php -S 启动失败:找不到 router 脚本或报错 No input file specified
PHP 内置服务器不是直接跑目录,它必须明确知道怎么处理每个请求——靠一个 router 脚本。没指定、路径写错、脚本里没返回 true 或没输出内容,都会卡在 No input file specified。
- 启动命令必须带
-t指定文档根目录,且router脚本路径是相对于当前工作目录的(不是相对于-t) -
router脚本里要显式处理静态资源:比如is_file(__DIR__ . '/public/' . $_SERVER['REQUEST_URI'])判断后用return false让内置服务器自己 serve;否则全被当 PHP 路由,而你又没include对应文件,就报错 - 常见错误写法:
php -S localhost:8000 router.php,但router.php里漏了对/css/app.css这类请求的判断,结果服务器尝试执行 CSS 文件 → 报错
php8.5 的 -S 默认不支持 HTTPS,也压根不读 php.ini
内置服务器是调试用的极简实现,没有 SSL 层,也不加载任何 php.ini 配置项(比如 display_errors、date.timezone)。你改了全局配置,它照样无视。
- 想开 HTTPS?不行。别试
-S加参数,它不认。真要本地 HTTPS,换symfony/web-server-bundle或laravel/sail,或者用 Caddy/Nginx 反代 -
php -S用的是 CLI SAPI,所有配置走默认值。调试时发现var_dump不输出、时区错、JSON 中文乱码,大概率是 CLI 模式下php.ini和你 Web SAPI(如 Apache/FPM)用的不是同一个 - 临时改配置?只能代码里硬写:
ini_set('display_errors', '1');或date_default_timezone_set('Asia/Shanghai');
路由脚本里 $_SERVER['REQUEST_URI'] 带 query string,但不自动解析 $_GET
PHP 内置服务器把整个原始请求路径(含 ?foo=bar)原封不动塞进 $_SERVER['REQUEST_URI'],但不会帮你 parse 成 $_GET 数组——这事得你自己干,尤其在单页应用(SPA)或 API 路由里容易翻车。
小兵小兵建站CMS V1.0(内容管理系统),基于OneThink开源框架,和超过300家以上网站建设客户进行了深度的合作与需求沟通,经过了一年时间的研发,打造了国内最简洁好用、易于操作的网站管理后台。小兵建站CMS,国内最简单易用的网站管理系统!永久免费开源!小兵建站CMS服务器配置要求:安装环境:PHP 版本 5.3以上 ; mysql: 5.0以上 IIS: 7.0 以上 安装
- 典型场景:前端路由用
/user/123,但实际请求可能是/user/123?_ver=2。如果你只按路径匹配,parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)才是安全取法 - 想让
$_GET可用?在router.php开头加一句:parse_str($_SERVER['QUERY_STRING'] ?? '', $_GET); - 注意:
$_SERVER['REQUEST_URI']在 Windows 下可能带 URL 编码未解码内容(如空格变%20),urldecode()要自己上
开发中别依赖内置服务器做长连接、并发或文件上传测试
它单线程、无队列、不缓存、不复用连接——PHP 官方文档写得清楚:“for development only”。真压测、传大文件、WebSocket、SSE,它会立刻暴露短板。
立即学习“PHP免费学习笔记(深入)”;
- 上传大文件?
post_max_size和upload_max_filesize在 CLI 模式下默认是 8M/2M,且无法通过.htaccess或ini_set动态改(因为不读 ini) - 并发请求?第二个请求会阻塞,直到第一个响应结束。浏览器开两个 tab 访问,第二个白屏等十几秒是常态
- 静态文件性能差:每次请求都重新 stat + open + read,没内存缓存。CSS/JS 多时明显卡顿,和 Nginx 差一个数量级
php -S,不等于你的代码在 FPM 或 Apache 下一定行。










