PHP CLI能运行但浏览器打不开,是因为浏览器无法解析PHP代码,必须通过HTTP协议由PHP内置服务器、Apache或Nginx执行;本地开发推荐使用php -S localhost:8000 router.php,需配置正确路由脚本、文档根目录和端口,并确保VSCode任务中启用isBackground:true。

PHP CLI 能运行但浏览器打不开?先确认你没在用 file:// 协议
VSCode 本身不带 PHP 服务器,点开 index.php 文件然后右键“Open with Live Server”——这招对 HTML 有效,但对 PHP 完全无效,因为浏览器无法解析 PHP 代码。你看到的只会是源码或 404,错误现象通常是:This page isn’t working 或直接下载文件。
真正要跑 PHP,必须走 HTTP 协议,由 PHP 自带的内置服务器、Apache 或 Nginx 接收请求并执行脚本。本地开发最轻量的选择就是 PHP CLI 内置服务器。
- 确保已安装 PHP(终端运行
php -v能输出版本号) - 不要双击打开 .php 文件,也不要依赖 VSCode 的预览插件
- 项目根目录下必须有可访问的入口文件(如
index.php),且不能放在系统隐藏目录(如~/.vscode)里
用 php -S 启动内置服务器:端口、路由、文档根目录怎么设
php -S 是 PHP 5.4+ 自带的命令行服务器,不用装 Apache,适合调试单项目。但它对路径和路由很敏感,设错就 404。
基本命令是:php -S localhost:8000,但这样只服务当前目录下的静态文件,PHP 脚本不会自动路由。必须加路由器脚本(哪怕只有一行):
php -S localhost:8000 router.php
其中 router.php 最小可用内容是:
<?php if (preg_match('/.(?:png|jpg|jpeg|gif|css|js|ico|xml|svg|woff|woff2|ttf|eot)$/', $_SERVER["REQUEST_URI"])) {
return false; // 让服务器返回静态文件
} else {
include __DIR__ . '/index.php'; // 所有其他请求都进入口
}
- 端口别选 80/443(需管理员权限),
8000、8080更安全 -
localhost比127.0.0.1更稳妥,某些系统 hosts 配置会影响解析 - 文档根目录 = 运行
php -S命令时所在的目录,不是 VSCode 工作区根目录(容易搞混) - 如果项目结构是
/public/index.php,就得先进入public目录再执行命令
VSCode 里一键启动:tasks.json 配置要点和常见失败原因
手动敲命令太麻烦,可以配 VSCode 的 task 自动拉起服务器。但很多人配完发现终端没反应、任务不执行、或者报 command 'php' not found。
关键在 .vscode/tasks.json 中指定正确路径和工作区:
{
"version": "2.0.0",
"tasks": [
{
"label": "php server",
"type": "shell",
"command": "php -S localhost:8000 -t ./public router.php",
"group": "build",
"isBackground": true,
"problemMatcher": [],
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
"clear": true
}
}
]
}
-
-t ./public显式声明文档根目录,比 cd 进目录更可靠 -
router.php必须和php -S命令在同一级目录,否则找不到 - Windows 用户注意:如果 PHP 不在系统 PATH 里,
command得写绝对路径,比如"C:\php\php.exe" -S ... -
isBackground: true必须加,否则任务会立即退出;同时要配problemMatcher空数组,不然 VSCode 以为出错了
浏览器能访问但 $_POST / $_GET 为空?检查 Content-Type 和表单提交方式
服务器跑起来了,echo $_GET['id'] 却总是空,常见原因是:你用 VSCode 插件发 HTTP 请求时没设对头,或者 HTML 表单 method 写成了 method="get" 但 URL 里根本没参数。
PHP 内置服务器对请求体解析较严格:
- HTML 表单必须明确写
,不能靠 JS 提交却漏掉Content-Type: application/x-www-form-urlencoded - 用 curl 测试时,
curl -X POST http://localhost:8000/ -d "name=foo"是 OK 的;但curl -H "Content-Type: application/json" -d '{"name":"foo"}'不会自动解析进$_POST,得自己读php://input - 浏览器地址栏输
http://localhost:8000/?test=1才会让$_GET['test']有值;只输http://localhost:8000/就是空数组
路由脚本里那句 return false 也很关键——它把静态资源请求放行,但如果你删了它,连 CSS/JS 都加载不了,页面看起来像没样式,容易误判为 PHP 没运行。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











