所有分类
  • 所有分类
  • 游戏源码
  • 网站源码
  • 单机游戏
  • 游戏素材
  • 搭建教程
  • 精品工具

基于PHP实现简单HTTP服务器|新手必看手把手教程+可直接运行代码

基于PHP实现简单HTTP服务器|新手必看手把手教程+可直接运行代码 一

文章目录CloseOpen

先搞懂:HTTP服务器到底在干吗?

其实HTTP服务器的工作特简单,就三步:蹲端口等请求接请求扔响应——像极了小区门口的便利店:

  • 蹲端口:就像便利店开门,挂个“营业中”的牌子(比如绑定8080端口),等着客人来;
  • 接请求:客人(浏览器)走进来,说“我要一瓶可乐”(比如请求/index.html);
  • 扔响应:你把可乐递过去(返回HTML页面或JSON数据),客人拿了就走。
  • 你不用管“TCP三次握手”“IP分组”这些底层细节——PHP的socket函数已经帮你把轮子造好了,你只要“骑上去”就行。我之前学的时候,光“监听端口”这个概念就查了半宿,后来发现其实就三行代码:

  • socket_create造个“电话”(负责和浏览器通信);
  • socket_bind把“电话”绑到“8080号工位”(指定端口);
  • socket_listen“守着电话等来电”(开始接收请求)。
  • 是不是瞬间就懂了?根本不用啃厚厚的《计算机网络》教材——先跑通代码,再回头理解概念,才是新手最该走的路。

    手把手搭服务器:从0到1写代码

    我把步骤拆成8步“傻瓜操作”,连注释都给你标好了,你复制过去就能用——

  • 准备工作:确保PHP开了socket扩展
  • 首先得确认PHP安装了socket扩展——打开命令行输php -m,看列表里有没有sockets。要是没有,Windows用户去php.ini里把extension=sockets前面的分号去掉;Mac用户用brew install php-sockets就行(我当年帮小宇调了半小时,才发现他没开扩展,差点急哭)。

  • 写代码:复制就能跑的server.php
  • 把下面的代码保存成server.php,每一行我都标了注释,你不用急着懂,先跑起来再说:

    <?php 

    //

  • 创建socket:造个“电话”,用IPv4+TCP协议
  • $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

    if (!$socket) die("socket创建失败: " . socket_strerror(socket_last_error()));

    //

  • 绑定端口:把“电话”绑到127.0.0.1:8080(本地地址+端口)
  • $result = socket_bind($socket, '127.0.0.1', 8080);

    if (!$result) die("端口绑定失败: " . socket_strerror(socket_last_error()));

    //

  • 开始监听:打开“店门”,等客人来
  • $result = socket_listen($socket);

    if (!$result) die("监听失败: " . socket_strerror(socket_last_error()));

    echo "服务器启动成功!请打开浏览器访问 http://127.0.0.1:8080n";

    //

  • 接受请求:等着客人(浏览器)进来
  • $client = socket_accept($socket);

    if (!$client) die("接受请求失败: " . socket_strerror(socket_last_error()));

    //

  • 读取请求内容:听听客人要什么(比如“我要首页”)
  • $request = socket_read($client, 1024); // 最多读1024字节,足够装普通GET请求

    echo "收到请求:n" . $request . "n";

    //

  • 构造响应:按HTTP格式打包内容(必须严格遵守!)
  • $response = "HTTP/1.1 200 OKrn" . // 状态行:请求成功

    "Content-Type: text/html; charset=utf-8rn" . // 响应头:返回HTML

    "Connection: closern" . // 响应头:用完就断开连接

    "rn" . // 空行:分隔响应头和内容(必须有!)

    "

    我的PHP服务器" .

    "

    " .

    "哇!我的第一个PHP服务器跑起来了!" .

    "

    这是用PHP socket函数写的哦~

    " .

    "";

    //

  • 发送响应:把内容扔给客人(浏览器)
  • socket_write($client, $response);

    //

  • 关闭连接:客人走了,关门收拾
  • socket_close($client);

    socket_close($socket);

    ?>

  • 启动服务器:命令行敲一行代码
  • 打开命令行,cd到server.php所在的文件夹,输:

    php server.php

    要是看到“服务器启动成功!请打开浏览器访问 http://127.0.0.1:8080”——恭喜你,服务器跑起来了!

  • 测试:浏览器访问看看
  • 打开Chrome或Edge,输入http://127.0.0.1:8080——你会看到一个绿色标题的页面,上面写着“哇!我的第一个PHP服务器跑起来了!”。我当时第一次看到这个页面,差点跳起来——这可是你自己写的服务器,不是Apache也不是Nginx,是纯PHP跑的!

    踩过的坑:这些细节能帮你少走弯路

    我和小宇当年踩过的坑,全给你列出来了,你别再犯:

    坑1:端口冲突——换个端口就行

    要是启动时提示“Address already in use”(地址已被占用),说明8080端口被其他程序占了(比如你开着Tomcat或Node.js服务器)。解决办法超简单:把代码里的8080改成80818888,再重启就行(我一般记三个常用端口:8080、8081、8888,总有一个能用)。

    坑2:响应格式错了——浏览器不认

    HTTP响应必须严格遵守“状态行→响应头→空行→响应体”的结构,少一个都不行!我当年犯过最蠢的错:把rn写成了n(只换行不回车),结果浏览器显示“无法访问此网站”,我盯着代码看了半小时才发现——换行必须用rn,这是HTTP协议的规定,浏览器认死理儿。

    我给你做了个HTTP响应格式对照表,你对照着写,绝对不会错:

    部分 示例内容 说明
    状态行 HTTP/1.1 200 OK 格式:协议版本+状态码+状态描述(200=成功,404=找不到页面)
    响应头 Content-Type: text/html; charset=utf-8 告诉浏览器返回的是什么内容(text/html=HTML,application/json=JSON)
    空行 rn 必须用rn分隔响应头和响应体,少了这行浏览器会乱码
    响应体

    我的PHP服务器

    实际要显示的内容,可以是HTML、JSON或纯文本

    坑3:忘了关闭连接——内存会爆炸

    要是你想让服务器一直运行(比如用while(true)循环接收请求),千万别忘了关闭$client连接!我之前写了个循环服务器,没加socket_close($client),跑了半小时,内存占了1G——PHP虽然会自动释放资源,但好习惯得从小养成(小宇当时把服务器跑了一晚上,第二天电脑卡得打不开微信,差点被室友打)。

    玩点更高级的:让服务器支持POST请求

    要是你想让服务器接收前端的POST数据(比如表单提交),其实只要解析请求体就行。我把代码改了一下,能接收POST请求并返回JSON——你复制过去,用Postman测测:

    <?php 

    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

    socket_bind($socket, '127.0.0.1', 8080);

    socket_listen($socket);

    while (true) { // 循环监听,一直等请求

    $client = socket_accept($socket);

    $request = socket_read($client, 1024);

    // 解析请求方法:是GET还是POST?

    $method = strtok($request, ' '); // 取请求的第一部分(GET/POST)

    $body = '';

    // 如果是POST请求,解析请求体(请求头后面的内容)

    if ($method === 'POST') {

    // 用rnrn分隔请求头和请求体

    $parts = explode("rnrn", $request);

    $body = $parts[1]; // 请求体内容(比如username=admin&password=123)

    }

    // 构造JSON响应:返回请求方法和请求体

    $response = "HTTP/1.1 200 OKrn" .

    "Content-Type: application/jsonrn" .

    "rn" .

    json_encode([

    'method' => $method,

    'body' => $body,

    'message' => 'POST请求接收成功!'

    ]);

    socket_write($client, $response);

    socket_close($client); // 别忘了关连接!

    }

    用Postman发个POST请求到http://127.0.0.1:8080,Body里填username=test&password=123——你会收到这样的响应:

    {
    

    "method": "POST",

    "body": "username=test&password=123",

    "message": "POST请求接收成功!"

    }

    是不是超简单?我用这个方法做了个个人备忘录接口,前端用Vue写个表单,提交数据直接存到本地文件里,不用搭数据库,不用买服务器——纯PHP就能搞定,特适合做小工具。

    最后:你已经超越90%的PHP新手了

    其实写HTTP服务器的核心不是“会写代码”,而是“理解HTTP的本质”——它就是浏览器和服务器之间的“对话规则”,你只要按规则说话,浏览器就会听你的。

    我当年教小宇的时候,他问我:“学这个有什么用?”我告诉他:“等你以后做接口开发(比如写API给前端用),或者搭个轻量级服务(比如给小程序做后端),你会发现今天学的东西能帮你省超多时间——不用搭Nginx,不用配置虚拟主机,一个PHP脚本就能跑起来。”

    现在你已经写了自己的第一个PHP服务器,要是按这些步骤试了,欢迎回来告诉我效果!要是碰到问题,比如启动报错或者浏览器打不开,直接留评论——我当年踩过的坑,可不想让你再踩一遍。

    对了,要是你想玩点更酷的,比如让服务器支持HTTPS(加密传输),可以去查openssl扩展的用法——其实原理差不多,就是给socket加层“加密外套”。我下次再写篇教程,教你用PHP做HTTPS服务器,记得关注我哦~

    赶紧去跑代码吧!等你的好消息~


    启动服务器时突然蹦出“Address already in use”,别慌——这不是你代码写错了,是你要绑定的端口被其他程序“抢”走了。我当年第一次搭PHP服务器就栽在这事儿上:早上开了个Node.js的Express服务测接口,忘了关,下午再启动PHP服务器,直接报这个错,盯着代码看了半小时才反应过来——8080端口早被Express占了。像Tomcat、Python的Flask,甚至有些杀毒软件后台进程,都爱“蹲”8080、3000这些常用端口。

    解决方法其实就改个数字的事儿。你打开server.php文件,找到socket_bind那行(就是写着“127.0.0.1, 8080”的地方),把8080换成没被占的端口就行——比如8081、8888,这俩是开发者的“万能备用端口”,一般不会冲突。改完保存,再重新运行php server.php,保准儿能启动。要是你怕记不住,干脆把这三个端口存手机备忘录:8080、8081、8888,轮流试,总能撞上空的。


    启动服务器时提示“Address already in use”怎么办?

    这是端口被其他程序占用(比如正在运行的Tomcat、Node.js服务)。解决方法很简单:打开server.php,将代码中的端口号(如8080)改成未被占用的端口(比如8081、8888),保存后重新启动服务器即可。

    为什么浏览器访问服务器显示“无法访问此网站”?

    最常见原因是HTTP响应格式错误——HTTP要求“状态行→响应头→空行→响应体”的严格结构,且换行必须用rn(不能只用n)。此外还要检查:服务器是否真的启动成功;浏览器输入的地址和端口是否正确(比如http://127.0.0.1:8080)。

    怎么让服务器一直运行,处理多个请求?

    默认代码处理一次请求就会关闭,只需添加while(true)无限循环即可持续监听。核心逻辑是:在socket_listen后,循环执行“接收请求(socket_accept)→处理请求→发送响应→关闭客户端连接(socket_close($client))”——注意不要关闭监听用的$socket

    PHP没开socket扩展怎么解决?

    先通过php -m命令检查是否有sockets扩展。如果没有:Windows用户打开PHP目录下的php.ini,去掉extension=sockets前面的分号(;),保存后重启;Mac/Linux用户用包管理工具安装(如Mac用brew install php-sockets,Ubuntu用sudo apt-get install php-sockets)。

    服务器能处理POST请求吗?怎么实现?

    可以处理。POST请求需要解析“请求体”(请求头后的内容):1)用strtok($request, ' ')提取请求方法(GET/POST);2)如果是POST,用explode("rnrn", $request)分隔请求头和请求体,第二部分就是POST数据(如username=test&password=123);3)最后构造JSON或HTML响应返回即可。

    原文链接:https://www.mayiym.com/46331.html,转载请注明出处。
    0
    显示验证码
    没有账号?注册  忘记密码?

    社交账号快速登录

    微信扫一扫关注
    如已关注,请回复“登录”二字获取验证码