php -s 返回404的根本原因是服务器仅在启动时的当前工作目录下查找文件,必须cd到php文件所在目录再执行命令;若文件在/project/src/,就不能在/project下运行php -s。

php -S 命令必须在文件所在目录执行
直接双击或拖进浏览器打不开 PHP 文件,是因为浏览器不解析 PHP 代码;php -S 启动的是一个简易 HTTP 服务器,但它只服务当前工作目录下的文件。如果你在别处运行命令,它找不到你的 index.php 或其他脚本。
常见错误现象:终端显示 PHP 8.3.6 Development Server started at Tue Jul 1 02:48:00 2026 Listening on http://localhost:8000 Document root is /home/user,但访问 http://localhost:8000/test.php 提示 404 —— 这说明服务器根目录不是你放文件的地方。
- 先用
cd切到 PHP 文件所在文件夹,比如cd /var/www/myapp - 确认该目录下有你要运行的文件,如
test.php,可用ls -l *.php查看 - 再运行
php -S localhost:8000,不要加路径参数(除非你明确需要路由控制) - 浏览器访问
http://localhost:8000/test.php,不是file:///协议地址
router.php 不是必须的,但写错会直接报错
当你需要处理 URL 路由(比如 SPA 的前端路由、重写规则),才需额外提供 router.php。它本质是一个返回 bool 的回调脚本:返回 true 表示“我来处理这个请求”,返回 false 表示“交给内置服务器尝试读取对应文件”。
容易踩的坑:
- 文件名拼错,比如写成
route.php,而命令里是php -S localhost:8000 router.php→ 报错Failed to open stream: No such file or directory -
router.php中用了未定义函数(如require_once 'vendor/autoload.php'),而当前目录没装 Composer → 启动失败,提示Fatal error - 忘记
return false;导致所有请求都进路由脚本,静态资源(CSS/JS)全 404
端口被占用时 php -S 会直接退出,不提示具体原因
php -S 默认绑定 localhost:8000,但如果该端口正被 Chrome、另一个 php -S 或 Docker 占用,命令会立即失败,只输出一行:Could not bind to localhost:8000,然后退出。
解决方法很直接:
- 换端口:运行
php -S localhost:8080或php -S 127.0.0.1:8001 - 查谁占着:Linux/macOS 执行
lsof -i :8000,Windows 执行netstat -ano | findstr :8000 - 别用
0.0.0.0绑定(如php -S 0.0.0.0:8000),这会让服务器监听所有网卡,可能触发防火墙警告或被局域网其他设备访问
内置服务器不解析 .htaccess,也不支持 Apache 模块功能
php -S 是纯 PHP 实现的单线程开发服务器,它完全不读取或执行 .htaccess 文件,也不加载任何 Apache 模块(如 mod_rewrite、mod_headers)。如果你的项目依赖这些功能,比如用 RewriteRule 做伪静态,那在 php -S 下必然失效。
典型表现:
- URL 里带
/user/profile却提示 404,而/index.php?path=user/profile能正常工作 - 设置
header('X-Frame-Options: DENY');生效,但Header set X-Content-Type-Options "nosniff"在.htaccess里写了也无效 - 想用
apache_get_modules()函数?它在php -S环境下始终返回空数组
真正要验证 Apache 行为,得切回 XAMPP 或配好 httpd.conf 的真实环境 —— 内置服务器只适合验证 PHP 逻辑和基础 HTTP 输出,不是 Apache/Nginx 替代品。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











