Socket是网络通信的基础,PHP通过内置的Socket扩展提供了完整的网络通信能力,适合实现简单的服务间通信、即时消息传输等场景。下面我们就一步步学习如何用PHP编写Socket程序。

一、环境准备
首先确认你的PHP环境已经开启了Socket扩展,一般默认情况下该扩展是开启的,你可以通过下面的代码检查:
<?php
// 检查Socket扩展是否可用
if (extension_loaded('sockets')) {
echo "Socket扩展已开启,可以正常进行Socket编程";
} else {
echo "请先开启PHP的sockets扩展";
}
?>二、编写Socket服务端
服务端的作用是监听指定端口,等待客户端连接,然后处理客户端发送的数据并返回响应。下面是一个简单的回声服务端示例,会把客户端发送的内容原样返回:
<?php
// 设置错误报告
error_reporting(E_ALL);
// 创建Socket资源,使用IPv4,TCP协议
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "Socket创建失败,错误信息:" . socket_strerror(socket_last_error()) . "\n";
exit;
}
// 绑定IP和端口,这里监听本地所有网卡的9501端口
$bindResult = socket_bind($socket, '0.0.0.0', 9501);
if ($bindResult === false) {
echo "绑定端口失败,错误信息:" . socket_strerror(socket_last_error($socket)) . "\n";
socket_close($socket);
exit;
}
// 开始监听,设置最大等待连接数为5
$listenResult = socket_listen($socket, 5);
if ($listenResult === false) {
echo "监听失败,错误信息:" . socket_strerror(socket_last_error($socket)) . "\n";
socket_close($socket);
exit;
}
echo "服务端启动成功,正在监听9501端口,等待客户端连接...\n";
// 循环处理客户端连接
while (true) {
// 接受客户端连接
$clientSocket = socket_accept($socket);
if ($clientSocket === false) {
echo "接受连接失败,错误信息:" . socket_strerror(socket_last_error($socket)) . "\n";
continue;
}
// 读取客户端发送的数据,最多读取1024字节
$data = socket_read($clientSocket, 1024);
if ($data === false) {
echo "读取数据失败,错误信息:" . socket_strerror(socket_last_error($clientSocket)) . "\n";
} else {
echo "收到客户端消息:" . trim($data) . "\n";
// 给客户端返回响应,原样返回接收到的内容
$response = "服务端已收到消息:" . $data;
socket_write($clientSocket, $response, strlen($response));
}
// 关闭当前客户端连接
socket_close($clientSocket);
}
// 关闭服务端Socket(实际运行中一般不会执行到这里)
socket_close($socket);
?>三、编写Socket客户端
客户端的作用是连接到服务端,发送数据并接收服务端的响应。下面是对应服务端的客户端示例:
<?php
// 创建Socket资源
$clientSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($clientSocket === false) {
echo "Socket创建失败,错误信息:" . socket_strerror(socket_last_error()) . "\n";
exit;
}
// 连接到服务端,这里连接本地9501端口
$connectResult = socket_connect($clientSocket, '127.0.0.1', 9501);
if ($connectResult === false) {
echo "连接服务端失败,错误信息:" . socket_strerror(socket_last_error($clientSocket)) . "\n";
socket_close($clientSocket);
exit;
}
// 发送消息到服务端
$message = "Hello,这是客户端发送的消息\n";
socket_write($clientSocket, $message, strlen($message));
// 读取服务端返回的响应
$response = socket_read($clientSocket, 1024);
if ($response === false) {
echo "读取响应失败,错误信息:" . socket_strerror(socket_last_error($clientSocket)) . "\n";
} else {
echo "收到服务端响应:" . $response . "\n";
}
// 关闭客户端Socket
socket_close($clientSocket);
?>四、运行与测试
1. 打开第一个终端,运行服务端脚本:php server.php,此时会看到服务端启动成功的提示。
2. 打开第二个终端,运行客户端脚本:php client.php,就能看到客户端发送消息并收到服务端响应的结果。
五、常见问题说明
- 如果启动服务端提示端口被占用,可以更换监听的端口号,或者先查看占用端口的进程并关闭。
- Socket读写时要注意数据的长度,避免读取不完整或者写入数据截断。
- 实际生产环境中需要处理更多的异常情况,比如连接超时、数据传输中断等,还要考虑多客户端并发的处理,可以使用多进程或者IO复用等方式优化。
六、核心函数说明
| 函数名 | 作用说明 |
|---|---|
| socket_create | 创建一个Socket资源,指定协议族、套接字类型和协议 |
| socket_bind | 将Socket绑定到指定的IP地址和端口 |
| socket_listen | 开始监听Socket,等待客户端连接 |
| socket_accept | 接受客户端的连接请求,返回客户端的Socket资源 |
| socket_read | 从Socket中读取数据 |
| socket_write | 向Socket写入数据 |
| socket_close | 关闭Socket资源,释放相关资源 |
到这里你就掌握了PHP Socket编程的基础用法,可以在此基础上扩展更多功能,比如实现简单的聊天室、服务间接口调用等场景。
PHP_Socket网络通信socket编程服务端开发修改时间:2026-06-02 04:24:58