当前位置: 首页 > article >正文

用PHP实现一个简单的http服务器

在 PHP 中,你可以使用 socket 函数编写一个简单的 HTTP 服务器。以下是一个示例代码,监听 9000 端口,当收到请求时返回 "Hello, World":

<?php
// 设置监听端口
$host = '127.0.0.1';
$port = 9000;

// 创建一个 TCP 套接字
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($server === false) {
    echo "无法创建套接字: " . socket_strerror(socket_last_error()) . "\n";
    exit(1);
}

// 绑定套接字到地址和端口
if (socket_bind($server, $host, $port) === false) {
    echo "无法绑定套接字: " . socket_strerror(socket_last_error()) . "\n";
    exit(1);
}

// 开始监听
if (socket_listen($server, 5) === false) {
    echo "无法监听端口: " . socket_strerror(socket_last_error()) . "\n";
    exit(1);
}

echo "服务器已启动,正在监听 $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);

代码解释:

  1. 创建服务器套接字socket_create() 创建一个 TCP 套接字,用于监听客户端的连接。
  2. 绑定套接字socket_bind() 将套接字绑定到本地的 127.0.0.1 地址和 9000 端口。
  3. 监听端口socket_listen() 开始监听客户端连接,最大等待队列为 5。
  4. 接受连接socket_accept() 等待并接受来自客户端的连接。
  5. 读取请求socket_read() 读取客户端发送的请求(这里只读取了请求的第一部分,实际应用中可以根据需要解析 HTTP 请求)。
  6. 发送响应:构建一个简单的 HTTP 响应,将 "Hello, World" 作为响应体返回。
  7. 关闭连接socket_close() 关闭客户端和服务器的套接字。

运行方式:

将上面的代码保存为 http_server.php,然后在命令行中运行:

php http_server.php

服务器将会启动,监听 9000 端口。当你使用浏览器或其他 HTTP 客户端(如 curl)访问 http://127.0.0.1:9000 时,你应该会收到以下响应:

Hello, World


http://www.kler.cn/a/402121.html

相关文章:

  • 【Python数据可视化分析实战】数据爬取—京东手机品牌信息数据爬取和数据分析与可视化
  • 【MySQL-4】表的基本查询
  • 青少年编程与数学 02-003 Go语言网络编程 21课题、Go语言WebSocket编程
  • CSS遮罩:mask
  • 不完全微分PID控制算法
  • Python-简单病毒程序合集(一)
  • 学习记录:js算法(九十八):课程表 II
  • 【Python数据可视化分析实战】数据爬取—京东手机品牌信息数据爬取和数据分析与可视化
  • 等保二级需要哪些安全设备?
  • openfoam中通过precice耦合的流固耦合案例如何单独运行流体这样可以防止报错float exception
  • 如何利用virtualenv和python命令创建Python虚拟环境
  • AI赋能电商:开启智慧零售新纪元
  • 高阶数据结构——图
  • Go语言里简短声明语句词法域问题
  • 【Electron】Electron Forge如何支持Element plus?
  • 视频里的音频怎么提取出来成单独文件?音频提取照着这些方法做
  • 论文阅读:Mixture-of-Agents Enhances Large Language Model Capabilities
  • MATLAB和Python发射光谱
  • 【Linux】深入理解GCC/G++编译流程及库文件管理
  • C++中的std::tuple和std::pair
  • C++---类型转换
  • 5G CPE:为什么活动会场与商铺的网络成为最新选择
  • lua调用C语言函数,在函数中进行类型检查
  • CPU服务器是指什么?
  • 如何解决Ubuntu 20.04中Vim编辑器在按下Ctrl+S时暂停响应的问题
  • 详细分析ipvsadm负载均衡的命令