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

admin4天前it知识29

以下是一个使用 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知识

相关文章

职场人如何写季度总结

作为职场人,写季度总结是一个展示自己工作成果和总结经验教训的机会。以下是一些撰写季度总结的建议:明确总结的目的:季度总结的目的是为了向上级领导汇报本季度的工作进展、成果和教训,以及下季度的工作计划。因...

技术与艺术的融合:创造无比魅力的结合

在人类文明的发展史上,技术与艺术如同一对形影不离的伙伴,共同推动了人类社会的进步。随着科技的飞速发展,技术与艺术的融合愈发紧密,为我们揭示了一个全新的视角,让我们重新审视这两股强大的力量。在当今数字化...

优美程序是怎样的

程序优美是一个主观的概念,每个人可能会有不同的看法。然而,以下是一些可能导致程序优美的因素:简洁性:优美的程序应该尽可能地简洁明了。这意味着应该使用尽可能少的数据结构和算法,以及尽可能简单的代码。可读...

享受工作:找到事业与生活的平衡点

工作是我们日常生活中不可或缺的一部分。我们花费大量的时间和精力在工作中,因此,如何享受工作并找到事业与生活的平衡点就显得尤为重要。在这篇文章中,我们将探讨如何享受工作,让事业和生活愉快并行。首先,了解...

夏天的台风

夏天,是一个充满活力和生命力的季节,但同时也伴随着台风的出现。每年的这个时期,台风如同一股强大的自然力量,给人们的生命和财产带来了一定的威胁。在台风的肆虐中,可以看到大自然的威力与无情。台风带来的强风...

拖延症重度患者怎样自救

对于拖延症的重度患者,自救的关键在于以下几点:识别并克服拖延的借口。拖延常常因为我们害怕、不确定、不想不舒服而找到各种借口。我们必须识破这些借口,并对自己说:“如果我拖延,后果将不堪设想。”制定清晰的...

发表评论

访客

看不清,换一张

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