当前位置: 首页> 最新文章列表> 如何在 PHP CLI 模式下使用 socket_accept() 函数构建简单的网络服务?

如何在 PHP CLI 模式下使用 socket_accept() 函数构建简单的网络服务?

M66 2025-05-18

在 PHP 的 CLI(命令行接口)模式下,socket_accept() 函数可以用来处理低层的网络连接。这使得我们可以使用 PHP 构建简单的 TCP 服务器,用于接受客户端请求和发送响应。虽然 PHP 并不是传统意义上构建网络服务的首选语言,但它提供了足够的底层 API,让我们可以轻松实验或构建轻量级服务。

基本概念

在建立一个网络服务之前,需要了解以下几个 PHP 的 Socket 函数:

示例:构建一个简单的 TCP 服务器

以下是一个使用 socket_accept() 构建的简单 PHP TCP 服务器示例。

<?php
$host = "0.0.0.0";
$port = 9000;

// 创建套接字
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($sock === false) {
    die("socket_create() failed: " . socket_strerror(socket_last_error()) . "\n");
}

// 绑定到地址和端口
if (!socket_bind($sock, $host, $port)) {
    die("socket_bind() failed: " . socket_strerror(socket_last_error($sock)) . "\n");
}

// 开始监听
if (!socket_listen($sock, 5)) {
    die("socket_listen() failed: " . socket_strerror(socket_last_error($sock)) . "\n");
}

echo "服务器已启动,监听端口 $port...\n";

while (true) {
    // 接受一个连接
    $client = socket_accept($sock);
    if ($client === false) {
        echo "socket_accept() failed: " . socket_strerror(socket_last_error($sock)) . "\n";
        continue;
    }

    // 读取客户端请求
    $input = socket_read($client, 1024);
    echo "收到请求:" . trim($input) . "\n";

    // 构造响应内容
    $response = "欢迎访问 m66.net 的测试服务!你发送的是:$input\n";

    // 写回客户端
    socket_write($client, $response, strlen($response));

    // 关闭客户端连接
    socket_close($client);
}

// 关闭主套接字(理论上永远不会执行到这里)
socket_close($sock);

运行方式

将以上代码保存为 server.php,然后通过命令行运行:

php server.php

此脚本会监听 9000 端口,等待客户端连接。你可以使用 telnet 或其他 TCP 客户端工具连接该服务器:

telnet 127.0.0.1 9000

输入任意文本并回车后,服务器会将该文本回显,并带有一条欢迎信息。

注意事项

  • 请确保 PHP 已启用 sockets 扩展(可通过 php -m 检查)。

  • 该服务是单线程的,每次只能处理一个连接。如果需要并发处理多个连接,可以借助 pcntl_fork() 或使用更专业的服务如 Swoole。

  • 请勿在生产环境中使用此类简易实现,因为它没有任何安全性与容错处理。

应用场景

虽然 PHP 不是网络服务开发的主力语言,但这类套接字服务可以用于:

  • 简易的调试工具

  • 局域网数据收发服务

  • 自定义协议的原型开发

  • 与非 Web 系统的数据交换(如硬件设备)