php -S 服务不能“重启”,必须 Ctrl+C 终止后重新运行命令;它是前台阻塞式单进程服务器,与 php-fpm 完全不同,不支持 systemctl 或 service 管理。

php -S 启动的服务不能用「重启」概念处理,它本质是单进程阻塞式开发服务器,改了代码必须手动终止再重运行。
直接 kill 进程再重跑 php -S
ThinkPHP5 官方推荐的本地启动方式是 php -S 0.0.0.0:99 -t public/,这种模式下没有后台服务、没有守护进程,也就不存在「systemctl restart」或「service php-fpm restart」这类操作。
常见错误现象:
- 改了控制器代码,浏览器刷新没变化 → 实际是旧进程还在跑,新代码根本没加载
- 终端卡住无法输入新命令 → 因为
php -S是前台阻塞运行,必须先中断
正确做法:
- 按
Ctrl + C终止当前php -S进程 - 确认终端已回到命令提示符(如
$或C:\>) - 重新执行完整命令:
php -S 0.0.0.0:99 -t public/
别把 php -S 和 php-fpm 混为一谈
很多人看到「重启 PHP 服务」就去搜 systemctl restart php-fpm,但这个命令对 php -S 完全无效——php-fpm 是独立的 FastCGI 管理器,而 php -S 是 PHP 内置的简易 HTTP 服务器,两者不共存、不兼容。
立即学习“PHP免费学习笔记(深入)”;
使用场景判断:
- 你在
public/目录下敲php -S→ 就用Ctrl + C+ 重跑 - 你配了 Nginx/Apache +
php-fpm→ 才需要systemctl restart php-fpm或systemctl restart nginx - 你用 phpStudy/XAMPP/WAMP → 实际重启的是 Apache/Nginx 服务,不是 PHP 本身
php -S 启动失败或端口被占怎么办
端口冲突是最常遇到的问题,尤其是 :99、:8000 这类低编号端口容易被其他程序占用。
排查步骤:
- 检查端口是否被占:
lsof -i :99(macOS/Linux)或netstat -ano | findstr :99(Windows) - 杀掉占用进程:
kill -9 [PID]或taskkill /F /PID [PID] - 换一个端口重试,比如:
php -S 0.0.0.0:8080 -t public/ - 确保当前目录是项目根目录(含
public/子目录),否则-t public/会报错
生产环境不要用 php -S
文档里写的 php -S 仅用于开发调试,它不支持并发、无超时控制、无静态资源缓存,更不处理 HTTPS。上线前必须换成 Nginx + php-fpm 或 Apache + mod_php。
这意味着:你在本地用 php -S 调通的功能,上线后如果行为异常,大概率不是「重启没到位」,而是运行环境差异导致的——比如路由规则、PATH_INFO 解析、跨域头、文件权限等。
最容易被忽略的一点:ThinkPHP5 的 URL 路由依赖 Web 服务器对 PATH_INFO 的传递,php -S 默认支持,但 Nginx 默认不传,需额外配置 fastcgi_param PATH_INFO $fastcgi_path_info;。



















