用PHP写一个简单的HTTP服务器示例
以下是一个使用 PHP Socket 原生实现的简单 HTTP 服务器示例,支持基础请求处理和响应:
<?php // 创建 TCP Socket $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket === false) { die("Socket 创建失败: " . socket_strerror(socket_last_error())); } // 设置 Socket 选项(允许地址重用) socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1); // 绑定 IP 和端口 if (!socket_bind($socket, '0.0.0.0', 8080)) { die("绑定失败: " . socket_strerror(socket_last_error())); } // 开始监听连接 if (!socket_listen($socket)) { die("监听失败: " . socket_strerror(socket_last_error())); } echo "HTTP 服务器已在 0.0.0.0:8080 启动...\n"; // 主循环:持续接受客户端连接 while (true) { $client = socket_accept($socket); if ($client === false) { continue; // 忽略无效连接 } // 读取客户端请求数据(最多读取 2048 字节) $request = socket_read($client, 2048); if (empty($request)) { socket_close($client); continue; } // 解析请求行(例如:GET / HTTP/1.1) $requestLine = explode("\n", $request)[0]; $method = explode(' ', $requestLine)[0] ?? 'GET'; $path = explode(' ', $requestLine)[1] ?? '/'; // 构造响应内容 $responseBody = ''; if ($path === '/') { $responseBody = "<h1>欢迎访问 PHP 服务器</h1><p>当前时间: " . date('Y-m-d H:i:s') . "</p>"; } else { $responseBody = "<h1>404 页面不存在</h1>"; } // 构造 HTTP 响应头 $response = "HTTP/1.1 200 OK\r\n"; $response .= "Content-Type: text/html; charset=utf-8\r\n"; $response .= "Content-Length: " . strlen($responseBody) . "\r\n"; $response .= "Connection: close\r\n\r\n"; $response .= $responseBody; // 发送响应并关闭连接 socket_write($client, $response); socket_close($client); } // 关闭主 Socket(通常不会执行到这里) socket_close($socket);
运行方法
将代码保存为
server.php
通过命令行启动服务器:
php server.php
浏览器访问
http://localhost:8080
关键代码解析
功能特性
基础路由:根据请求路径返回不同内容(
/
返回欢迎页,其他路径返回 404)动态内容:在响应中插入当前服务器时间
协议规范:严格遵循 HTTP 协议头格式
跨平台:可在 Windows/Linux/macOS 运行
注意事项
单线程限制:此示例为单线程处理,同一时间只能处理一个请求
性能问题:仅适用于学习演示,生产环境建议使用 Nginx + PHP-FPM 或 Swoole
安全风险:未做任何安全防护,不可暴露到公网
停止服务:按
Ctrl+C
终止进程
如果需要更高性能的解决方案,可以考虑基于 Swoole 扩展实现协程服务器,或者使用 PHP 内置的开发服务器快速调试:
# 启动 PHP 内置服务器(指定文档根目录)
php -S localhost:8000 -t public/