查看: 12|回复: 0

[教程] 基于PHP实现一个简单的http服务器

[复制链接]

0

主题

0

回帖

0

积分

积极分子

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2011-11-3
发表于 昨天 17:28 | 显示全部楼层 |阅读模式

在 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 "服务器已启动,正在监听 $hostport...\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() 创建一个 TCP 套接字,用于监听客户端的连接。

绑定套接字:socket_bind() 将套接字绑定到本地的 127.0.0.1 地址和 9000 端口。

监听端口:socket_listen() 开始监听客户端连接,最大等待队列为 5。

接受连接:socket_accept() 等待并接受来自客户端的连接。

读取请求:socket_read() 读取客户端发送的请求(这里只读取了请求的第一部分,实际应用中可以根据需要解析 HTTP 请求)。

发送响应:构建一个简单的 HTTP 响应,将 "Hello, World" 作为响应体返回。

关闭连接:socket_close() 关闭客户端和服务器的套接字。

运行方式:

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

php http_server.php

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

Hello, World

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部