发布于2026-07-23 阅读(0)
扫一扫,手机访问
PHP 的 socket 函数往往被低估——很多人觉得用框架写 Web 服务才叫“正经开发”,但事实上,用原生的 socket 系列函数搭一个 HTTP 服务器,既能帮你理解底层协议,又能在某些轻量级场景下快速验证想法。下面这个例子,监听 9000 端口,收到请求就返回 "Hello, World",代码本身非常简洁,关键是要搞懂每一行背后的逻辑。
服务器已启动,正在监听 $host:$port...\n";
while (true) {
// 接受客户端连接
$client = socket_accept($server);
if ($client === false) {
echo "无法接受客户端连接: " . socket_strerror(socket_last_error()) . "\n";
continue;
}
// 读取客户端请求
$request = socket_read($client, 1024);
// 构建 HTTP 响应内容
$response = "HTTP/1.1 200 OK\r\n";
$response .= "Content-Type: text/plain\r\n";
$response .= "Connection: close\r\n";
$response .= "\r\n";
$response .= "Hello, World";
// 发送响应到客户端
socket_write($client, $response);
// 关闭客户端连接
socket_close($client);
}
// 关闭服务器套接字
socket_close($server);
逐层拆解一下,你会发现每个函数都承担着明确的职责:
创建服务器套接字——socket_create() 指定了 IPv4 地址族(AF_INET)、TCP 流(SOCK_STREAM)和 TCP 协议(SOL_TCP),这就是一个标准 TCP 监听套接字的起点。
绑定套接字——socket_bind() 把套接字绑定到本机 127.0.0.1 的 9000 端口。这一步相当于给你的服务器贴上一个“门牌号”,客户端才能找到它。
监听端口——socket_listen() 第二个参数 5 表示最大等待连接队列的长度。如果同时有超过 5 个客户端尝试连接,多出来的会被拒绝或排队,具体取决于操作系统。
接受连接——socket_accept() 会阻塞等待,直到有客户端连上来。每次接受后返回一个新的 socket 资源($client),用于与该客户端通信。
读取请求——socket_read() 这里只读了 1024 字节,实际生产环境需要根据 HTTP 请求头中的 Content-Length 或分块编码来完整读取。但作为演示,只读第一段就足够了。
发送响应——手动拼装 HTTP 协议头:状态行、头部字段、空行、响应体。注意每个头部字段后都要有 \r\n,最后用两个连续的 \r\n 分隔头部和正文。把 "Hello, World" 当作文本返回。
关闭连接——每次处理完一个客户端后,先关闭客户端连接,最终服务器退出时再关闭主监听套接字。
把这段代码保存为 http_server.php,然后在终端执行:
php http_server.php
看到 "服务器已启动" 的提示后,打开浏览器访问 http://127.0.0.1:9000,或者用 curl 测试:
Hello, World
这个简单示例虽然远不能支撑生产环境,但它揭示了 HTTP 服务器最底层的运作方式:套接字创建、绑定、监听、接受、读写、关闭。当你理解了这些,再去看那些框架中的中间件、路由、请求解析,脑子里就会多一张“地图”。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8