Workerman WebServer 不能直接运行 PHP 脚本,因其仅作 HTTP 静态服务或转发,不调用 PHP 解释器;官方明确不支持,需通过反代 PHP-FPM 或重写为原生 Workerman 风格实现动态逻辑。

Workerman WebServer 能不能直接跑 PHP 脚本
不能。Workerman 的 WebServer 类本身不解析 .php 文件,它只是个 HTTP 服务器,收到请求后只做静态文件返回或转发——你丢一个 index.php 给它,它会当成纯文本发出去,不会执行。
常见错误现象:curl http://127.0.0.1:8080/index.php 返回的是 PHP 源码,而不是执行结果;浏览器里看到满屏 <?php echo 'hello'; ?>。
- 它底层用的是 PHP 的
file_get_contents()或readfile()读取文件,不调用 PHP 解释器 - 想让它“运行 PHP”,必须手动触发
eval()、include()或通过proc_open()调外部 PHP CLI,但都不安全也不推荐 - Workerman 官方明确不支持 PHP 脚本解析,这不是 bug,是设计定位问题
替代 Nginx 跑纯 PHP 服务的可行路径
真要脱离 Nginx,又想跑传统 PHP(比如 WordPress、ThinkPHP、原生 $_GET/$_POST 脚本),唯一靠谱的方式是:用 Workerman 做反向代理,把 PHP 请求转给 PHP-FPM,自己不碰解析逻辑。
使用场景:内网小工具、CI/CD 临时服务、Docker 单容器轻量部署,不需要 rewrite、HTTPS 终止、高级缓存等 Nginx 特性。
立即学习“PHP免费学习笔记(深入)”;
- 启动 PHP-FPM,监听
127.0.0.1:9000(Unix socket 更优,但 TCP 更易调试) - Workerman 用
Worker::sendToTcpServer()或stream_socket_client()把 FastCGI 请求发过去 - 必须自己组 FastCGI 包(header + body),不能直接
fgets()就完事——Workerman 不内置 FastCGI 客户端 - 推荐用现成封装:
workerman/php-socket或reactphp/http配合reactphp/fastcgi,但这就偏离了纯 Workerman 轻量初衷
更现实的选择:改写为 Workerman 原生风格
如果你控制得了代码,别硬套 .php 文件路由那一套,直接用 Workerman 的事件驱动模型重写入口逻辑——性能更好,也真正发挥它的优势。
参数差异明显:$_SERVER['REQUEST_URI'] 还在,但 $_GET、$_POST 得自己从 $request->get()、$request->post() 拿(需用 Workerman\Http\Request);session_start() 不能用,得换 Redis 或文件存储手写 session 管理。
- 静态资源走
WebServer,动态接口走HttpServer,两者可共存于同一端口(靠路由判断) - 别依赖
.htaccess或nginx.conf的 rewrite,所有路由写死在 PHP 里,例如if ($request->path() === '/api/user') { ... } - 注意
$_FILES上传要手动解析$request->rawBody(),Workerman 不自动 parse multipart(除非用Workerman\Http\UploadedFile辅助类)
容易被忽略的兼容性坑
不是所有 PHP 扩展和写法都能平移。Workerman 是常驻内存进程,require_once 只加载一次,全局变量、静态属性会跨请求残留——这和 PHP-CGI/FPM 的“每次请求全新环境”完全不同。
-
date_default_timezone_set()必须在 Worker 启动前调用,不能放在某个请求处理里 - 数据库连接不能复用同一个
PDO实例(可能被其他连接 close),要用连接池或每次 new - 第三方 SDK(如微信、支付宝)若内部用了
sleep()、file_get_contents()同步阻塞调用,会卡住整个 EventLoop - 日志写文件要注意并发,多个 Worker 写同一文件需加锁,或统一走
syslog/redis/stdout
说到底,Workerman 不是 Nginx 替代品,而是另一种服务模型。想省事跑老 PHP 项目,老老实实配 Nginx + PHP-FPM;真要用 Workerman,就得接受它对编码方式的约束。



















