用PHP写一个简单的HTTP服务器示例

admin10个月前 (05-05)it知识682

以下是一个使用 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);


运行方法

  1. 将代码保存为 server.php

  2. 通过命令行启动服务器:

php server.php
  1. 浏览器访问 http://localhost:8080



关键代码解析

代码片段功能说明
socket_create创建 TCP Socket 对象
socket_bind绑定 IP 和端口(0.0.0.0 表示监听所有网络接口)
socket_listen开始监听传入连接
socket_accept接受客户端连接(阻塞直到有新连接)
socket_read读取客户端请求数据
解析 $requestLine提取 HTTP 方法和请求路径
构造 $response生成符合 HTTP 协议的响应头(含 Content-Type 和 Content-Length 等必要字段)
socket_write + socket_close发送响应并关闭当前连接

功能特性

  1. 基础路由‌:根据请求路径返回不同内容(/ 返回欢迎页,其他路径返回 404)

  2. 动态内容‌:在响应中插入当前服务器时间

  3. 协议规范‌:严格遵循 HTTP 协议头格式

  4. 跨平台‌:可在 Windows/Linux/macOS 运行


注意事项

  1. 单线程限制‌:此示例为单线程处理,同一时间只能处理一个请求

  2. 性能问题‌:仅适用于学习演示,生产环境建议使用 Nginx + PHP-FPM 或 Swoole

  3. 安全风险‌:未做任何安全防护,不可暴露到公网

  4. 停止服务‌:按 Ctrl+C 终止进程

如果需要更高性能的解决方案,可以考虑基于 Swoole 扩展实现协程服务器,或者使用 PHP 内置的开发服务器快速调试:

# 启动 PHP 内置服务器(指定文档根目录)

php -S localhost:8000 -t public/


标签: 分享IT知识

相关文章

黄金秋季

黄金秋季,这是一个充满色彩和韵味的季节。天空湛蓝,阳光明媚,微风轻拂,树叶由绿变黄,由黄变红,最终落叶归根。这是一个大自然最美丽的时刻,一切都在这一刻达到了高潮。秋天的阳光特别柔和,它不像夏天那样灼热...

中秋

月光如水,映照着中国大地。这是一个收获的季节,也是一个团圆的时刻。在秋天的长夜里,一轮明月在苍穹之中绽放出光芒,那是中秋之夜的明月,是华夏民族心中的瑰宝。中秋,又称月圆之夜,起源于古代农耕社会对月亮的...

格林童话故事-水晶球

从前有个女巫,她有三个儿子,这兄弟三人真是手足情深,可女巫却不信任他们,总以为他们会夺走她的权。于是她把老大变成了一只苍鹰,只能生活在悬崖顶上,人们时常看见它在空中不停地翱翔盘旋。她又把老二变成一头鲸...

当前人工智能技术发展水平

一、生成能力:突破人类效率边界‌文本与跨模态生成‌3秒生成专业级商业计划书,实时翻译114种语言(含8种中国方言);AI工具(如Manus)可解压文件、筛选简历并导出报告,实现异步任务处理‌;图像生成...

javascript 数据处理方法

以下是 JavaScript 中常用的数据处理方法整理,涵盖数组、字符串、对象、数字及数据类型判断等场景:一、数组处理‌遍历与转换‌map():遍历数组并返回新数组,常用于数据映射(如数值加倍)fil...

前端懒加载技术分析

前端懒加载(Lazy Loading)是一种通过延迟加载非关键资源来优化网页性能的技术,广泛应用于图片、组件、模块等场景。以下是其核心内容及实现方式的综合说明:‌一、核心原理‌‌视口检测机制‌懒加载通...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。