php -s 启动失败主因是未指定文档根目录(-t 参数),导致默认在当前目录查找 index.php 或 router.php,而框架入口通常位于 public/ 子目录,缺失文件即报“failed to open stream”或 404。

直接用 php -S 启动即可,但必须明确指定文档根目录(-t 参数),否则会报错 Failed to open stream: No such file or directory。
为什么 php -S localhost:8000 常常失败?
因为该命令默认把当前目录当作 Web 根目录,而 PHP 文件(比如 index.php)通常在 public/ 或 www/ 子目录里。如果当前目录下没有可路由的 PHP 文件,服务器启动后访问 http://localhost:8000 就会 404 或直接报错。
- ThinkPHP/Laravel 等框架:入口文件
index.php在public/目录,必须加-t public/ - 纯 PHP 项目:若
index.php就在当前目录,php -S localhost:8000可直接运行 - 没加
-t却放错位置 → 报错Warning: Unknown: failed to open stream: No such file or directory
php -S 启动时必须带哪些参数?
最小可用组合只有两个要素:监听地址 + 文档根目录。路由脚本(如 router.php)是可选的,但对 ThinkPHP 这类依赖 PATH_INFO 的框架几乎必需。
- 基础启动(静态文件或简单脚本):
php -S localhost:8000 -t ./ - ThinkPHP6/Laravel:
php -S localhost:8000 -t public/ - 需要重写支持(如访问
/user/123而非/index.php/user/123):php -S localhost:8000 -t public/ router.php,且router.php中需手动转发请求到public/index.php - 端口被占用?换一个,比如
php -S localhost:8080 -t public/
命令行执行 PHP 文件和启动服务有什么本质区别?
前者是 CLI 模式单次执行脚本,后者是 HTTP 模式长期监听请求——两者不能混用。误把 php index.php 当成服务启动,只会输出 HTML 源码到终端,浏览器根本打不开。
-
php index.php:输出结果到终端,执行完就退出,不监听端口 -
php -S localhost:8000 -t public/:进程常驻,等待 HTTP 请求,支持多次访问 - 想看
var_dump($_SERVER)的真实值?必须用-S启动,CLI 下$_SERVER['REQUEST_URI']等字段为空或不可靠 - 框架自动加载、路由解析、中间件等机制,只在 HTTP 请求上下文中触发
最容易被忽略的是:内置服务器不解析 .htaccess,也不支持 Apache/Nginx 的重写规则。哪怕你写了 router.php,也得自己 parse $_SERVER['REQUEST_URI'] 并 include 对应文件——这不是配置问题,是设计如此。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











