在 PHP 的 CLI(命令行接口)模式下,socket_accept() 函数可以用来处理低层的网络连接。这使得我们可以使用 PHP 构建简单的 TCP 服务器,用于接受客户端请求和发送响应。虽然 PHP 并不是传统意义上构建网络服务的首选语言,但它提供了足够的底层 API,让我们可以轻松实验或构建轻量级服务。
在建立一个网络服务之前,需要了解以下几个 PHP 的 Socket 函数:
socket_create():创建一个套接字资源。
socket_bind():将套接字绑定到 IP 地址和端口上。
socket_listen():监听传入的连接。
socket_accept():接受连接请求。
socket_read() / socket_write():用于接收和发送数据。
socket_close():关闭连接。
以下是一个使用 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 系统的数据交换(如硬件设备)